species/class except those that are outright impossible (because of god restrictions). When choosing a character, you can pick any random character or one of the recommended combinations. This does not take (un)restricted choices for weapons/books/gods into account. Apart from that, it's pretty good, though we might want to (un)restrict some combinations.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6142 c06c8d41-db1a-0410-9941-cceddc491573
C2PRXJYHDRF2642VDAUY76HJKCPQFGWDI6AM3SMCMYCHGWYDQXQQC LNSP6EQJHTJTRXJBV4WXRL4HMQ3JLCXQWQNUYFFBGSWI2B33MXHAC SKWBAGSAB625IIN4UP3NCPRX2H3KCPC2LULHS2A7JVRLO3EUBJDAC K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC JJULXW764V5C2HJKZNWQAEWB6QM5YZADD7ZCE35LYTBFEM6PMYCAC UKYGZDI6PYZPXDACCQGVPHANUP5ADCSNROOZIE7LYIZQWSNFHJZAC 6O5667Y65C5GTP4V3NBKWUN22IRGCAXEELJ6MCANMYPBOKDUO75QC OVM7ZULJJ6Q23AQ747AWBGISGDQYCGF2NT5YTXKW633I56WIYZPQC VXSORUQOM2VZA4CAZDC6KPAY373NQIN3UT7CXQXTRCYXO2WM62DAC LABXKXWWQY2V4FUDLGVTDYHXINAP6KRHZDHBQ2FE22FFOEIZPL6QC RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC 5UVDIVD4NSXA52U4QMQIVST3GSZJ2A2YZK3RUEXKPM43YVQ7LI5AC 6LT6USGJOTDMRJGXLAN2NSZXK2GKWEXDKKUV6SVV7ZC6WI6EKMDQC HODV46TCH5AGI42Z5JKVDX4VCRVQCNREJUL6W3TUJK6S77SXQNLQC P2ZCF3BBG523ZEOD6XQA4X5YEHBTWH3IM33YVHXP2SQ5POXZIH4QC 3GJTOMYXXJLY7QZNJLIONXAOHMU64PDYRXUYYQATIB7WPRHSNN6AC RKU2FIDSJCR4GZYBI7CLCFEYXVV5KRKI2CJFDNQT7YMWXUTUG7TAC MWI3RZPVTZOCVZEIR6U3OLXSKX3VMT2IZOY7IX5EJNVSSWVLG5WQC A4BTFRR7MAUIABPGMTNPKPZVVSP5XPFGEOCX4YEI7U3EUAKNJAMAC QXQE7C5XDYNF4JSHGDAVMS7HYLOC6YEZFOVFJ3RD7RB6U4AJSFIQC DE2BXPJDLWN7F3LAYKUSWI5CFEYZMV2ZN4K2Y356NWIX4AIGD73QC VDMADGWYGYZJWAEWU3WE7UCPVDS2O6HOHCXLOML64U5UCH4FER3AC WQIEW3O4MANA2KKYRUWEZP44KHVJ4RRHEZTDXSF4EDELX66LO26QC S4BRP4VHB23F2FCC6BXNAN2MZRVUGW7QMXUEOAVZVGFXKXJPVLLQC 3NIWNYMNSQZEEXZLEQADAAB3D7GLO5FIH64U5P5YQUVIV5MOURCAC X3ZYEJMCHJC27L6YT2NRYB6EN2T3XFRJNUENVHGRPBUKMTVHAGVQC 77H4BWWPPGLM3PLZH4QTAJRXIZTSDVNCOKZE223I437FN2UJ34RQC GUXTGUEMZYBRGV5QUAQSJHG3AOIQDWWCDIMOX4LASFJAZVGL2WQAC PNRMCHHEBCAUD2XBSSH6JOEQ6A6CFEZBCIX436DVD26DA52OCYTQC CIPVRZGLOZHCERK6YPOBV3P2E4IAB4H6D5EHLRQE2O5E4P4VCBUAC WTBQLBYFLQCF3NRAMB4Z2YA4MHYVFYI5YS7FXXBPICY2KCBA63AQC FNNHPDRUNN3NT34PMF7NRS2GNRAVL2XUUS2UVN5EB3BHUV23ERYQC JDM5R3HYGXKQKZWY35QZ2KOB24TFZ3FW2PCNXCRCMWG72AZC5ZXQC B5OK4FEITJ6MUT7J76OJJH2TOPTZGG7J7UPIJ6Z6WA5FC526FLTAC HPDTZAK3CLBMDCJY3747CM6FDSZQOOHVVCU35G6MPDA4ZBAI6DXAC SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC H7BW6SEIQ57X6V4BM2RX54W42W6BH5XJBAS6FYCYKLQQG43ZMU4QC KAL42YT6OQXFPMKKKHE2NQM47W5KMLSRI6KWFRTJFAO4WKP4MMLAC RGWUYJO74FDGTH22CYSHBKFDGJ4S76WTLIULKPXA4QT5ZCNOB4LQC STQDS62PD6PCLYBAB7LPYTG47WMBJP3FIJL55UHC3XFDPGERC3UQC O6ZMFKDI3XO2SWPNEYHIPYFDWJR4TVDP5BAATK6LVCVETQID6E7AC 25CH7HH4LKXFIZ75YNMXS3TSXO6O27DYSOPLOD45K4OCNFWLS4LQC 2NCKGJDDPPGP2NXYYPEPVRJIIWEP6M7HE6WYMQN3UNNN3C2JIRFQC 5OVWAD2MGK2NT6Q546KW7HZHELVDBBRC2CQX6VZMZF2YVRC7CPVAC UFNXOEBCAUO3QMYOF6EXYILHZ44AXVMCOV76SFV3VV7DMVUPZWBAC WN3ZHNL4T7QMQC6JF5DJR6NHLZVOGQVO4OJNEKEM5FZKQ7AVOP4AC KH5DN75GPQGMSUV5VTNFSXV4G3Q43O4R4M2BADFSYEEQYUQFCWMAC P2YNOE2TUTZFAOBTHJOIVD6TCV7J7D2UKUX67LHZUL6QY44ZMENQC 3A3OAIFRFU3IHF6SDNDPCN3XYOFYIBYCEYJAXAFASCFDY76SMFXQC QEEJFAETO6B2J4IWDIDCJ5UNIFNNHHG22IWF2CUJRTJJBNE47CWQC TI2HASZUN3QBTNWRCXLXJHOZBOUHFEOQUCPK5EYLATL7BP32H6LQC M5ZDZJBTOJ7SWQPZZQPC24JYZKP26MWSRDHXBWQE2MPPL6WCXOIQC LAMIVDKY7LO5ONX5Z273ZCCEA5UBENOJD5VWNE4AK2EXGFED6BFQC CJKEUBURR2NB7I43WBO3LGPSNMCM6SGR5HOPQKK5IKC3PN47JUDQC HH5S4A3M4XPI23PCXKKG36H5ES2Z67NDLQFFMPA5PEWL3FJ4674QC YYMVEFSCN7DGZC74WGG53XOLQF42KY2KGBXF2GOAXCR6WEE5VHCQC SJP5BHX6MFWF3OSQPEF4WUWZWPUGMOVURTT2CUVT6H3A66LETXUAC CQ24AVAI6SW3AHTIDMLPSTRRBEU6FHRF5I5FD6G5QIYE6PO4BQMQC 3GRGONHWIZ7PTTNMJ6CIZEMIKC7N2DTU62BLJ5QG4E7RGA5O2XMAC LJSES3YZH4RECLXVBRJXS54NJOLWXVBKV5GXBPVQBLRCYXX23X4AC TFO3DNZBDBA7YGKQKL624CG6DMVCEOPWQNAXDEV42ZODT5U3666AC KFULGQQOHWUTXOM3BXCCYPGGVGGY4Z6265XUFRCBPNLTZAEHJZSQC LECIKTCYNIZX557PIJWPY73WM652RHZDIAY4J7OXIK7NY4LZ2ZJAC GO6DARZD47R5UPXZIBMPX7PZUGJH24JWYDFMTWWESS4IZR7PAWRQC KZPVMW55ZETV4H4UE4DWOJWK2KSYIJOB7S2SY5XCWVOTRANXO6TQC IXW2IM5ITYDCXDB3ORDDVAR5XUSPVQ3BWLP3Q6TRXNTIKGMZTHXAC CYAVI4PYWMMKTPYT5N2B3MI4OSHZFLPKOZFSLFJUXRYAACYXWW3AC FWLLPRIZDBJVQ336TPOLYAFT6WYGAFC52OFIOTRN2YQPFZ3PQVRQC RVST2QHYJ757ZHK4AUJ5NGPDZ44AD6RVFVXYPKQIBJXZBDNUCHXQC UF4ODJOCV3ZL7DXRLLOFVWHUKKJX34FO4ZM6VJAWEJ3QVP3XZ2AAC 4UQBOVCMAMNCCF6PPX222H6JJO7MPYOKKC2NBKMVYIT5R5FOACNAC XPCGZBHHSL6MB3ORMUJI64BAERU6AZTIY6RK56BBW7SNB3IK24IAC TM35IHKZZNBCMR3ERBS4EYHGUK5IVCPUT2JUITMT74AYAIUZSYFQC EHSY6DVGUMI6C67WKET3GDJVLWJWGYBYQONNDK5JVT7BCTHBEZVAC int speci = (player_genus(GENPC_ELVEN)) ? 1 :(player_genus(GENPC_DWARVEN)) ? 2 :(you.species == SP_HILL_ORC) ? 3 :0;// now add appropriate species type modswitch (speci){case 1:
// Now add appropriate species type mod.if (player_genus(GENPC_ELVEN))
// copy name into you.your_name if set from environment --// note that you.your_name could already be set from init.txt// this, clearly, will overwrite such information {dlb}
// Copy name into you.your_name if set from environment --// note that you.your_name could already be set from init.txt.// This, clearly, will overwrite such information. {dlb}
case SP_GNOME:case SP_KENKU:case SP_MINOTAUR:
return CC_BANNED;case SP_HIGH_ELF:case SP_GREY_ELF:case SP_DEEP_ELF:case SP_SLUDGE_ELF:case SP_HALFLING:case SP_KOBOLD:
switch (speci){case SP_CENTAUR:case SP_KENKU:case SP_MINOTAUR:case SP_OGRE:case SP_OGRE_MAGE:case SP_TROLL:return false;default:return true;}
case SP_HUMAN:case SP_MOUNTAIN_DWARF:case SP_HIGH_ELF:
case SP_MUMMY:case SP_DEMIGOD:case SP_DEMONSPAWN:case SP_GHOUL:case SP_VAMPIRE:return CC_BANNED;case SP_GREY_ELF:case SP_DEEP_ELF:case SP_SLUDGE_ELF:case SP_HALFLING:case SP_KOBOLD:case SP_NAGA:case SP_GNOME:case SP_OGRE:case SP_TROLL:case SP_OGRE_MAGE:case SP_RED_DRACONIAN:
if (speci == SP_SLUDGE_ELF)return true;if (player_genus(GENPC_ELVEN, speci))return false;if (player_genus(GENPC_DRACONIAN, speci))return false;if (_species_is_undead( speci ))return false;
case SP_CENTAUR:case SP_DEMIGOD:case SP_DEMONSPAWN:case SP_GREY_ELF:case SP_HIGH_ELF:case SP_DEEP_ELF:case SP_SLUDGE_ELF:case SP_HUMAN:case SP_KENKU:// xbows --case SP_HILL_ORC:// slings --
// javelinscase SP_MERFOLK:return true;
case SP_TROLL:case SP_OGRE_MAGE:case SP_RED_DRACONIAN:case SP_SPRIGGAN:case SP_GHOUL:case SP_VAMPIRE:return CC_RESTRICTED;
if (player_genus(GENPC_DRACONIAN, speci))return false;if (speci == SP_VAMPIRE)return true;if (_species_is_undead( speci ))return false;
if (player_genus(GENPC_DWARVEN, speci))return false;if (_species_is_undead( speci ))return false;
case SP_TROLL:return false;default:return true;}case JOB_WARPER:if (player_genus(GENPC_DWARVEN, speci))return false;if (player_genus(GENPC_DRACONIAN, speci))return true;if (_species_is_undead( speci ))return false;switch (speci){case SP_CENTAUR:case SP_GNOME:case SP_HILL_ORC:
// using the fact that CONJ_I and MINOR_MAGIC_I are both// fire books, CONJ_II and MINOR_MAGIC_II are both ice booksif ( Options.book && Options.book <= numbooks )
char_choice_restriction book_restrictions[3];// Fireswitch (you.species){case SP_HUMAN:case SP_HIGH_ELF:case SP_GREY_ELF:case SP_DEEP_ELF:case SP_MOUNTAIN_DWARF:case SP_KOBOLD:case SP_MUMMY:case SP_NAGA:case SP_OGRE_MAGE:case SP_RED_DRACONIAN:case SP_DEMIGOD:case SP_DEMONSPAWN:case SP_KENKU:book_restrictions[0] = CC_UNRESTRICTED;break;default:book_restrictions[0] = CC_RESTRICTED;}// Iceswitch (you.species){case SP_HUMAN:case SP_HIGH_ELF:case SP_GREY_ELF:case SP_DEEP_ELF:case SP_KOBOLD:case SP_MUMMY:case SP_NAGA:case SP_OGRE_MAGE:case SP_RED_DRACONIAN:case SP_DEMIGOD:case SP_DEMONSPAWN:case SP_KENKU:case SP_MERFOLK:book_restrictions[1] = CC_UNRESTRICTED;break;default:book_restrictions[1] = CC_RESTRICTED;}// Summoningswitch (you.species){case SP_GREY_ELF:case SP_DEEP_ELF:case SP_SLUDGE_ELF:case SP_KOBOLD:case SP_MUMMY:case SP_NAGA:case SP_KENKU:case SP_VAMPIRE:book_restrictions[2] = CC_UNRESTRICTED;break;default:book_restrictions[2] = CC_RESTRICTED;}// Using the fact that CONJ_I and MINOR_MAGIC_I are both// fire books, CONJ_II and MINOR_MAGIC_II are both ice books.if (Options.book && Options.book <= numbooks)
int num_choices = 4;
int num_choices = 5;// Short swordswitch (you.species){case SP_HIGH_ELF:case SP_GREY_ELF:case SP_DEEP_ELF:case SP_HALFLING:case SP_KOBOLD:case SP_GNOME:startwep_restrictions[0] = CC_UNRESTRICTED;break;default:startwep_restrictions[0] = CC_RESTRICTED;}// Mace and hand axeswitch (you.species){case SP_HUMAN:case SP_MOUNTAIN_DWARF:case SP_HILL_ORC:case SP_MUMMY:case SP_CENTAUR:case SP_DEMIGOD:case SP_MINOTAUR:case SP_DEMONSPAWN:case SP_KENKU:startwep_restrictions[1] = CC_UNRESTRICTED;startwep_restrictions[2] = CC_UNRESTRICTED;break;default:startwep_restrictions[1] = CC_RESTRICTED;startwep_restrictions[2] = CC_RESTRICTED;}// Spearswitch (you.species){case SP_HUMAN:case SP_HILL_ORC:case SP_MUMMY:case SP_CENTAUR:case SP_DEMIGOD:case SP_MINOTAUR:case SP_DEMONSPAWN:case SP_KENKU:case SP_MERFOLK:startwep_restrictions[3] = CC_UNRESTRICTED;break;default:startwep_restrictions[3] = CC_RESTRICTED;}
// requires stuff::modify_all_stats() and works because// stats zeroed out by newgame::init_player()... recall// that demonspawn & demigods get more later on {dlb}
// Requires stuff::modify_all_stats() and works because// stats zeroed out by newgame::init_player()... Recall// that demonspawn & demigods get more later on. {dlb}
item.sub_type = rod_type;item.quantity = 1;item.special = you.item_description[IDESC_STAVES][rod_type];item.colour = BROWN;
item.sub_type = rod_type;item.quantity = 1;item.special = you.item_description[IDESC_STAVES][rod_type];item.colour = BROWN;
ng_race = (randrace? '*' : keyn);if (you.species == SP_RED_DRACONIAN)you.species = _random_draconian_species();
ng_race = (randrace ? (good_randrace? '+' : '*'): keyn);
if (you.species != SP_UNKNOWN&& !_class_allowed(you.species, _get_class(i)))
which_job = _get_class(i);// Dim text for restricted classes.// Thief and wanderer are general challenge classes in that there's// no species that's unrestricted in combination with them.if (you.species == SP_UNKNOWN&& which_job != JOB_THIEF && which_job != JOB_WANDERER|| you.species != SP_UNKNOWN&& _class_allowed(you.species, which_job) == CC_UNRESTRICTED)
if (you.species == SP_UNKNOWN|| _class_allowed(you.species, static_cast<job_type>(i))){job_count++;if (one_chance_in( job_count ))chosen_job = static_cast<job_type>(i);}}ASSERT( chosen_job != JOB_UNKNOWN );
job = static_cast<job_type>(i);if (good_random && (job == JOB_THIEF || job == JOB_WANDERER))continue;
{chosen_job = _get_class(letter_to_index(keyn));}
chosen_job = _get_class(letter_to_index(keyn));
// deep elves get hand crossbows, everyone else gets blowguns// (deep elves tend to suck at melee and need something that// can do ranged damage)
// Deep elves get hand crossbows, everyone else gets blowguns.// (Deep elves tend to suck at melee and need something that// can do ranged damage.)
you.skills[SK_DARTS] = 2;you.skills[SK_DODGING] = 2;you.skills[SK_STEALTH] = 1;you.skills[SK_SPELLCASTING] = 2;
you.skills[SK_DARTS] = 2;you.skills[SK_DODGING] = 2;you.skills[SK_STEALTH] = 1;you.skills[SK_SPELLCASTING] = 2;
switch (you.species){case SP_HUMAN:case SP_HIGH_ELF:case SP_SLUDGE_ELF:case SP_MOUNTAIN_DWARF:case SP_HALFLING:case SP_HILL_ORC:case SP_GNOME:case SP_OGRE:case SP_TROLL:case SP_RED_DRACONIAN:case SP_CENTAUR:case SP_MINOTAUR:case SP_DEMONSPAWN:case SP_GHOUL:case SP_MERFOLK:case SP_VAMPIRE:textcolor(LIGHTGREY);break;default:textcolor(DARKGREY);}
textcolor( LIGHTGREY );
switch (you.species){case SP_HUMAN:case SP_SLUDGE_ELF:case SP_MOUNTAIN_DWARF:case SP_HILL_ORC:case SP_OGRE:case SP_TROLL:case SP_RED_DRACONIAN:case SP_CENTAUR:case SP_MINOTAUR:case SP_DEMONSPAWN:case SP_MERFOLK:case SP_VAMPIRE:textcolor( LIGHTGREY );break;default:textcolor( DARKGREY );}
switch (you.species){case SP_HUMAN:case SP_HIGH_ELF:case SP_SLUDGE_ELF:case SP_MOUNTAIN_DWARF:case SP_HALFLING:case SP_HILL_ORC:case SP_KOBOLD:case SP_MUMMY:case SP_GNOME:case SP_OGRE:case SP_TROLL:case SP_RED_DRACONIAN:case SP_CENTAUR:case SP_MINOTAUR:case SP_DEMONSPAWN:case SP_GHOUL:case SP_MERFOLK:case SP_VAMPIRE:textcolor( LIGHTGREY );break;default:textcolor( DARKGREY );}