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 mod
switch (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 --
// javelins
case 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 books
if ( Options.book && Options.book <= numbooks )
char_choice_restriction book_restrictions[3];
// Fire
switch (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;
}
// Ice
switch (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;
}
// Summoning
switch (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 sword
switch (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 axe
switch (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;
}
// Spear
switch (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 );
}