the old or new species/classes order is used. Entails some more unborking of newgame.cc.
Also: make Esc leave the species selection screen (synonym for 'X', quit the game), and use it to jump back to species selection from all other selection possibilities (class, book, weapon, god) as a synonym for Bksp.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3505 c06c8d41-db1a-0410-9941-cceddc491573
JDM5R3HYGXKQKZWY35QZ2KOB24TFZ3FW2PCNXCRCMWG72AZC5ZXQC
FW3BFOY6UIWUMYNALIJMPEBTRQIMKUVRHOVFOHDKB3KRGA2QOGPQC
UKYGZDI6PYZPXDACCQGVPHANUP5ADCSNROOZIE7LYIZQWSNFHJZAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
M5ZDZJBTOJ7SWQPZZQPC24JYZKP26MWSRDHXBWQE2MPPL6WCXOIQC
XHFG7QUF4UF7OYU7KWT2EB6XITI2BZDHH2D2FD7YP33C3M4GRBKQC
YN7KNAJU72XINIQ3GP7RJLKW3STMN5VWJV2K66ICPZXR2VMYLZPAC
ZBPZZ5A7AB2VFZKQ2UJXVDGUK22OCZJCEN2RWTGDGK3VXFCCDKVAC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
BTO5WE4OEK64DZQVNYLOESM74KKQNE7KSNMQVF5UDB26OBKP7ORQC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
GUXTGUEMZYBRGV5QUAQSJHG3AOIQDWWCDIMOX4LASFJAZVGL2WQAC
WTBQLBYFLQCF3NRAMB4Z2YA4MHYVFYI5YS7FXXBPICY2KCBA63AQC
77H4BWWPPGLM3PLZH4QTAJRXIZTSDVNCOKZE223I437FN2UJ34RQC
FNNHPDRUNN3NT34PMF7NRS2GNRAVL2XUUS2UVN5EB3BHUV23ERYQC
B5OK4FEITJ6MUT7J76OJJH2TOPTZGG7J7UPIJ6Z6WA5FC526FLTAC
AAAUQAV76BL63J4HPATVE67LJD4L6OES4A2XODS2OGISOFYQY3XQC
S4BRP4VHB23F2FCC6BXNAN2MZRVUGW7QMXUEOAVZVGFXKXJPVLLQC
CQ24AVAI6SW3AHTIDMLPSTRRBEU6FHRF5I5FD6G5QIYE6PO4BQMQC
ND3T5LCZATC63EVQ6SLI7XXMSUL7XICJDNLH3UCYUDEFWTA3N5MQC
25CH7HH4LKXFIZ75YNMXS3TSXO6O27DYSOPLOD45K4OCNFWLS4LQC
K2MLPJIAXXZRWEWZCNSGICCBNIU2WAAPT7SPIMOH7FLLTOB4QFRAC
FMBJCM5LJKCG326YRJGOOJU6QNWONXAHK2AB4CP4SAOHKJ5CORXQC
WL5WZXFJ6TONUQRSHUY4GQ5USU47ILWNN5X2JDQZO4CRJJZSRQIAC
RVST2QHYJ757ZHK4AUJ5NGPDZ44AD6RVFVXYPKQIBJXZBDNUCHXQC
EHSY6DVGUMI6C67WKET3GDJVLWJWGYBYQONNDK5JVT7BCTHBEZVAC
XPCGZBHHSL6MB3ORMUJI64BAERU6AZTIY6RK56BBW7SNB3IK24IAC
/* ***********************************************************************
* called from: newgame
* *********************************************************************** */
int get_species_index_by_abbrev( const char *abbrev );
int get_species_index_by_name( const char *name );
const char *get_species_abbrev( int which_species );
int get_class_index_by_abbrev( const char *abbrev );
int get_class_index_by_name( const char *name );
const char *get_class_abbrev( int which_job );
const char *get_class_name( int which_job );
case SP_GNOME: res = (adj ? "Gnomish" : "Gnome"); break;
case SP_OGRE: res = (adj ? "Ogreish" : "Ogre"); break;
case SP_TROLL: res = (adj ? "Trollish" : "Troll"); break;
case SP_DEMIGOD: res = (adj ? "Divine" : "Demigod"); break;
case SP_DEMONSPAWN: res = (adj ? "Demonic" : "Demonspawn" ); break;
case SP_GHOUL: res = (adj ? "Ghoulish" : "Ghoul"); break;
case SP_MERFOLK: res = (adj ? "Merfolkian" : "Merfolk"); break;
default: res = (adj ? "Yakish" : "Yak"); break;
case SP_GNOME: res = (adj ? "Gnomish" : "Gnome"); break;
case SP_OGRE: res = (adj ? "Ogreish" : "Ogre"); break;
case SP_TROLL: res = (adj ? "Trollish" : "Troll"); break;
case SP_DEMIGOD: res = (adj ? "Divine" : "Demigod"); break;
case SP_DEMONSPAWN: res = (adj ? "Demonic" : "Demonspawn" ); break;
case SP_GHOUL: res = (adj ? "Ghoulish" : "Ghoul"); break;
case SP_MERFOLK: res = (adj ? "Merfolkian" : "Merfolk"); break;
default: res = (adj ? "Yakish" : "Yak"); break;
static const char * Species_Abbrev_List[ NUM_SPECIES ] =
{ "XX", "Hu", "HE", "GE", "DE", "SE", "MD", "Ha",
"HO", "Ko", "Mu", "Na", "Gn", "Og", "Tr", "OM",
// the draconians
"Dr", "Dr", "Dr", "Dr", "Dr", "Dr", "Dr", "Dr", "Dr", "Dr",
"Ce", "DG", "Sp", "Mi", "DS", "Gh", "Ke", "Mf", "Vp",
// placeholders
"HD", "El" };
int get_species_index_by_abbrev( const char *abbrev )
{
int i;
ASSERT(ARRAYSIZE(Species_Abbrev_List) == NUM_SPECIES);
for (i = SP_HUMAN; i < NUM_SPECIES; i++)
{
if (tolower( abbrev[0] ) == tolower( Species_Abbrev_List[i][0] )
&& tolower( abbrev[1] ) == tolower( Species_Abbrev_List[i][1] ))
{
break;
}
}
return ((i < NUM_SPECIES) ? i : -1);
}
int get_species_index_by_name( const char *name )
{
int i;
int sp = -1;
std::string::size_type pos = std::string::npos;
char lowered_buff[80];
strncpy( lowered_buff, name, sizeof( lowered_buff ) );
strlwr( lowered_buff );
for (i = SP_HUMAN; i < NUM_SPECIES; i++)
{
const std::string lowered_species =
lowercase_string(species_name(static_cast<species_type>(i),0));
pos = lowered_species.find( lowered_buff );
if (pos != std::string::npos)
{
sp = i;
if (pos == 0) // prefix takes preference
break;
}
}
return (sp);
}
const char *get_species_abbrev( int which_species )
{
ASSERT( which_species > 0 && which_species < NUM_SPECIES );
return (Species_Abbrev_List[ which_species ]);
}
static const char * Class_Abbrev_List[ NUM_JOBS ] =
{ "Fi", "Wz", "Pr", "Th", "Gl", "Ne", "Pa", "As", "Be", "Hu",
"Cj", "En", "FE", "IE", "Su", "AE", "EE", "Cr", "DK", "VM",
"CK", "Tm", "He", "Re", "St", "Mo", "Wr", "Wn" };
static const char * Class_Name_List[ NUM_JOBS ] =
{ "Fighter", "Wizard", "Priest", "Thief", "Gladiator", "Necromancer",
"Paladin", "Assassin", "Berserker", "Hunter", "Conjurer", "Enchanter",
"Fire Elementalist", "Ice Elementalist", "Summoner", "Air Elementalist",
"Earth Elementalist", "Crusader", "Death Knight", "Venom Mage",
"Chaos Knight", "Transmuter", "Healer", "Reaver", "Stalker",
"Monk", "Warper", "Wanderer" };
int get_class_index_by_abbrev( const char *abbrev )
{
int i;
for (i = 0; i < NUM_JOBS; i++)
{
if (tolower( abbrev[0] ) == tolower( Class_Abbrev_List[i][0] )
&& tolower( abbrev[1] ) == tolower( Class_Abbrev_List[i][1] ))
{
break;
}
}
return ((i < NUM_JOBS) ? i : -1);
}
const char *get_class_abbrev( int which_job )
{
ASSERT( which_job < NUM_JOBS );
return (Class_Abbrev_List[ which_job ]);
}
int get_class_index_by_name( const char *name )
{
int i;
int cl = -1;
char *ptr;
char lowered_buff[80];
char lowered_class[80];
strncpy( lowered_buff, name, sizeof( lowered_buff ) );
strlwr( lowered_buff );
for (i = 0; i < NUM_JOBS; i++)
{
strncpy( lowered_class, Class_Name_List[i], sizeof( lowered_class ) );
strlwr( lowered_class );
ptr = strstr( lowered_class, lowered_buff );
if (ptr != NULL)
{
cl = i;
if (ptr == lowered_class) // prefix takes preference
break;
}
}
return (cl);
}
const char *get_class_name( int which_job )
{
ASSERT( which_job < NUM_JOBS );
return (Class_Name_List[ which_job ]);
}
// last updated 12may2000 {dlb}
/* ***********************************************************************
* called from: initfile
* *********************************************************************** */
int get_species_index_by_abbrev( const char *abbrev );
int get_species_index_by_name( const char *name );
const char *get_species_abbrev( int which_species );
int get_class_index_by_abbrev( const char *abbrev );
int get_class_index_by_name( const char *name );
const char *get_class_abbrev( int which_job );
const char *get_class_name( int which_job );
}
static const char * Species_Abbrev_List[ NUM_SPECIES ] =
{ "XX", "Hu", "HE", "GE", "DE", "SE", "MD", "Ha",
"HO", "Ko", "Mu", "Na", "Gn", "Og", "Tr", "OM",
// the draconians
"Dr", "Dr", "Dr", "Dr", "Dr", "Dr", "Dr", "Dr", "Dr", "Dr",
"Ce", "DG", "Sp", "Mi", "DS", "Gh", "Ke", "Mf", "Vp",
// placeholders
"HD", "El" };
int get_species_index_by_abbrev( const char *abbrev )
{
COMPILE_CHECK(ARRAYSIZE(Species_Abbrev_List) == NUM_SPECIES, c1);
for (unsigned i = 0; i < ARRAYSIZE(old_species_order); i++)
{
const int sp = (Options.use_old_selection_order ? old_species_order[i]
: new_species_order[i]);
if (tolower( abbrev[0] ) == tolower( Species_Abbrev_List[sp][0] )
&& tolower( abbrev[1] ) == tolower( Species_Abbrev_List[sp][1] ))
{
return i;
}
}
return (-1);
}
int get_species_index_by_name( const char *name )
{
unsigned int i;
int sp = -1;
std::string::size_type pos = std::string::npos;
char lowered_buff[80];
strncpy( lowered_buff, name, sizeof( lowered_buff ) );
strlwr( lowered_buff );
for (i = 0; i < ARRAYSIZE(old_species_order); i++)
{
const species_type real_sp
= (Options.use_old_selection_order ? old_species_order[i]
: new_species_order[i]);
const std::string lowered_species =
lowercase_string(species_name(real_sp,1));
pos = lowered_species.find( lowered_buff );
if (pos != std::string::npos)
{
sp = i;
if (pos == 0) // prefix takes preference
break;
}
}
return (sp);
const char *get_species_abbrev( int which_species )
{
ASSERT( which_species > 0 && which_species < NUM_SPECIES );
return (Species_Abbrev_List[ which_species ]);
}
static const char * Class_Abbrev_List[ NUM_JOBS ] =
{ "Fi", "Wz", "Pr", "Th", "Gl", "Ne", "Pa", "As", "Be", "Hu",
"Cj", "En", "FE", "IE", "Su", "AE", "EE", "Cr", "DK", "VM",
"CK", "Tm", "He", "Re", "St", "Mo", "Wr", "Wn" };
static const char * Class_Name_List[ NUM_JOBS ] =
{ "Fighter", "Wizard", "Priest", "Thief", "Gladiator", "Necromancer",
"Paladin", "Assassin", "Berserker", "Hunter", "Conjurer", "Enchanter",
"Fire Elementalist", "Ice Elementalist", "Summoner", "Air Elementalist",
"Earth Elementalist", "Crusader", "Death Knight", "Venom Mage",
"Chaos Knight", "Transmuter", "Healer", "Reaver", "Stalker",
"Monk", "Warper", "Wanderer" };
int get_class_index_by_abbrev( const char *abbrev )
{
COMPILE_CHECK(ARRAYSIZE(Class_Abbrev_List) == NUM_JOBS, c1);
COMPILE_CHECK(ARRAYSIZE(Class_Name_List) == NUM_JOBS, c2);
for (unsigned int i = 0; i < ARRAYSIZE(old_jobs_order); i++)
{
const job_type job
= (Options.use_old_selection_order ? old_jobs_order[i]
: new_jobs_order[i]);
if (tolower( abbrev[0] ) == tolower( Class_Abbrev_List[job][0] )
&& tolower( abbrev[1] ) == tolower( Class_Abbrev_List[job][1] ))
{
return i;
}
}
return (-1);
}
const char *get_class_abbrev( int which_job )
{
ASSERT( which_job < NUM_JOBS );
return (Class_Abbrev_List[ which_job ]);
}
int get_class_index_by_name( const char *name )
{
char *ptr;
char lowered_buff[80];
char lowered_class[80];
strncpy( lowered_buff, name, sizeof( lowered_buff ) );
strlwr( lowered_buff );
int cl = -1;
for (unsigned int i = 0; i < ARRAYSIZE(old_jobs_order); i++)
{
const int job = (Options.use_old_selection_order ? old_jobs_order[i]
: new_jobs_order[i]);
strncpy( lowered_class, Class_Name_List[job], sizeof( lowered_class ) );
strlwr( lowered_class );
ptr = strstr( lowered_class, lowered_buff );
if (ptr != NULL)
{
cl = i;
if (ptr == lowered_class) // prefix takes preference
break;
}
}
return (cl);
}
const char *get_class_name( int which_job )
{
ASSERT( which_job < NUM_JOBS );
return (Class_Name_List[ which_job ]);
}
} while (keyin != '*' &&
((keyin != '\r' && keyin != '\n') ||
Options.prev_book == SBT_NO_SELECTION ) &&
(keyin < 'a' || keyin >= ('a' + numbooks)));
if ( keyin == '\r' || keyin == '\n' )
{
if ( Options.prev_book == SBT_RANDOM )
keyin = '*';
else
keyin = ('a' + Options.prev_book - 1);
}
} while (keyin != '*' && (keyin < 'a' || keyin >= ('a' + numbooks)));
}
break;
case CK_BKSP:
case CK_ESCAPE:
case ' ':
return false;
case '\r':
case '\n':
if (Options.prev_weapon != WPN_UNKNOWN)
{
if (Options.prev_weapon == WPN_RANDOM)
keyin = '*';
else
{
for (int i = 0; i < num_choices; ++i)
if (startwep[i] == Options.prev_weapon)
keyin = 'a' + i;
}
}
}
while (keyin != '*' &&
((keyin != '\r' && keyin != '\n')
|| Options.prev_weapon == WPN_UNKNOWN) &&
(keyin < 'a' || keyin > ('a' + num_choices)));
while (keyin != '*' && (keyin < 'a' || keyin > ('a' + num_choices)));
if (keyin == '\r' || keyin == '\n')
{
if (Options.prev_weapon == WPN_RANDOM)
keyin = '*';
else
{
for (int i = 0; i < num_choices; ++i)
if (startwep[i] == Options.prev_weapon)
keyin = 'a' + i;
}
}
if ((keyn == '\r' || keyn == '\n')
&& Options.prev_pr != GOD_NO_GOD)
{
keyn = Options.prev_pr == GOD_ZIN? 'a' :
Options.prev_pr == GOD_YREDELEMNUL? 'b' :
Options.prev_pr == GOD_BEOGH? 'c' :
'*';
if ((keyn == '\r' || keyn == '\n')
&& Options.prev_pr != GOD_NO_GOD)
{
keyn = Options.prev_pr == GOD_ZIN? 'a' :
Options.prev_pr == GOD_YREDELEMNUL? 'b' :
Options.prev_pr == GOD_BEOGH? 'c' :
'*';
switch (keyn)
{
case CK_BKSP:
case ' ':
return false;
case 'X':
cprintf(EOL "Goodbye!");
end(0);
break;
case '*':
you.religion = coinflip()? GOD_ZIN : GOD_YREDELEMNUL;
if (you.species == SP_HILL_ORC && coinflip())
you.religion = GOD_BEOGH;
break;
case 'a':
you.religion = GOD_ZIN;
break;
case 'b':
you.religion = GOD_YREDELEMNUL;
break;
case 'c':
if (you.species == SP_HILL_ORC)
switch (keyn)
} // else fall through
default:
goto getkey;
}
ng_pr = keyn == '*'? GOD_RANDOM : you.religion;
case CK_BKSP:
case ESCAPE:
case ' ':
return false;
case '\r':
case '\n':
if (Options.prev_pr == GOD_NO_GOD
|| Options.prev_pr == GOD_BEOGH
&& you.species != SP_HILL_ORC)
{
break;
}
if (Options.prev_pr != GOD_RANDOM)
{
Options.prev_pr
= static_cast<god_type>(Options.prev_pr);
break;
}
keyn = '*'; // for ng_pr setting
// fall-through for random
case '*':
you.religion = coinflip()? GOD_ZIN : GOD_YREDELEMNUL;
if (you.species == SP_HILL_ORC && coinflip())
you.religion = GOD_BEOGH;
break;
case 'a':
you.religion = GOD_ZIN;
break;
case 'b':
you.religion = GOD_YREDELEMNUL;
break;
case 'c':
if (you.species == SP_HILL_ORC)
{
you.religion = GOD_BEOGH;
break;
} // else fall through
default:
break;
}
} while (you.religion == GOD_NO_GOD);
ng_pr = (keyn == '*'? GOD_RANDOM : you.religion);
if ((keyn == '\r' || keyn == '\n')
&& Options.prev_dk != DK_NO_SELECTION)
{
keyn = Options.prev_dk == DK_NECROMANCY? 'a' :
Options.prev_dk == DK_YREDELEMNUL? 'b' :
'*';
}
do {
keyn = c_getch();
switch (keyn)
{
case CK_BKSP:
case ' ':
return false;
case 'X':
cprintf(EOL "Goodbye!");
end(0);
break;
case '*':
choice = coinflip()? DK_NECROMANCY : DK_YREDELEMNUL;
break;
case 'a':
cprintf(EOL "Very well.");
choice = DK_NECROMANCY;
break;
case 'b':
choice = DK_YREDELEMNUL;
break;
default:
goto getkey1;
}
ng_dk = keyn == '*'? DK_RANDOM : choice;
switch (keyn)
{
case 'X':
cprintf(EOL "Goodbye!");
end(0);
break;
case CK_BKSP:
case ESCAPE:
case ' ':
return false;
case '\r':
case '\n':
if (Options.prev_dk == DK_NO_SELECTION)
break;
if (Options.prev_dk != DK_RANDOM)
{
choice = Options.prev_dk;
break;
}
keyn = '*'; // for ng_dk setting
// fall-through for random
case '*':
choice = coinflip()? DK_NECROMANCY : DK_YREDELEMNUL;
break;
case 'a':
cprintf(EOL "Very well.");
choice = DK_NECROMANCY;
break;
case 'b':
choice = DK_YREDELEMNUL;
default:
break;
}
} while (choice == DK_NO_SELECTION);
ng_dk = (keyn == '*'? DK_RANDOM : choice);
}
getkey2:
keyn = c_getch();
if ((keyn == '\r' || keyn == '\n')
&& Options.prev_ck != GOD_NO_GOD)
{
keyn = Options.prev_ck == GOD_XOM? 'a' :
Options.prev_ck == GOD_MAKHLEB? 'b' :
'*';
case CK_BKSP:
case ' ':
return false;
case 'X':
cprintf(EOL "Goodbye!");
end(0);
break;
case '*':
you.religion = coinflip()? GOD_XOM : GOD_MAKHLEB;
break;
case 'a':
you.religion = GOD_XOM;
break;
case 'b':
you.religion = GOD_MAKHLEB;
break;
default:
goto getkey2;
}
keyn = c_getch();
ng_ck = keyn == '*'? GOD_RANDOM : you.religion;
switch (keyn)
{
case 'X':
cprintf(EOL "Goodbye!");
end(0);
break;
case CK_BKSP:
case CK_ESCAPE:
case ' ':
return false;
case '\r':
case '\n':
if (Options.prev_ck == GOD_NO_GOD)
break;
if (Options.prev_ck != GOD_RANDOM)
{
you.religion = static_cast<god_type>(Options.prev_ck);
break;
}
keyn = '*'; // for ng_ck setting
// fall-through for random
case '*':
you.religion = (coinflip()? GOD_XOM : GOD_MAKHLEB);
break;
case 'a':
you.religion = GOD_XOM;
break;
case 'b':
you.religion = GOD_MAKHLEB;
// fall through
default:
break;
}
} while (you.religion == GOD_NO_GOD);
ng_ck = (keyn == '*'? GOD_RANDOM : you.religion);