diff options
author | Robert Vollmert <rvollmert@gmx.net> | 2009-10-23 20:22:17 +0200 |
---|---|---|
committer | Robert Vollmert <rvollmert@gmx.net> | 2009-10-23 20:30:14 +0200 |
commit | bea4408fe95cd8660cafc4dbedba321ebc4f0b12 (patch) | |
tree | 48a93386188ed565359d1a62c4f464f89bed6c7b /crawl-ref/source/jobs.cc | |
parent | 99a646377ec4f88d4cdea7b18ea8e49dbb1d6516 (diff) | |
download | crawl-ref-bea4408fe95cd8660cafc4dbedba321ebc4f0b12.tar.gz crawl-ref-bea4408fe95cd8660cafc4dbedba321ebc4f0b12.zip |
Moving data out of newgame.cc.
Also move species<->string translation from player.cc to species.cc.
Diffstat (limited to 'crawl-ref/source/jobs.cc')
-rw-r--r-- | crawl-ref/source/jobs.cc | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/crawl-ref/source/jobs.cc b/crawl-ref/source/jobs.cc new file mode 100644 index 0000000000..14e88c55bc --- /dev/null +++ b/crawl-ref/source/jobs.cc @@ -0,0 +1,192 @@ +#include "AppHdr.h" + +#include "jobs.h" + +// Listed in two columns to match the selection screen output. +// Take care to list all valid classes here, or they cannot be directly chosen. +// The old and new lists are expected to have the same length. +static job_type old_jobs_order[] = { + JOB_FIGHTER, JOB_WIZARD, + JOB_PRIEST, JOB_THIEF, + JOB_GLADIATOR, JOB_NECROMANCER, + JOB_PALADIN, JOB_ASSASSIN, + JOB_BERSERKER, JOB_HUNTER, + JOB_CONJURER, JOB_ENCHANTER, + JOB_FIRE_ELEMENTALIST, JOB_ICE_ELEMENTALIST, + JOB_SUMMONER, JOB_AIR_ELEMENTALIST, + JOB_EARTH_ELEMENTALIST, JOB_CRUSADER, + JOB_DEATH_KNIGHT, JOB_VENOM_MAGE, + JOB_CHAOS_KNIGHT, JOB_TRANSMUTER, + JOB_HEALER, JOB_REAVER, + JOB_STALKER, JOB_MONK, + JOB_WARPER, JOB_WANDERER, + JOB_ARTIFICER +}; + +// First plain fighters, then religious fighters, then spell-casting +// fighters, then primary spell-casters, then stabbers and shooters. (MM) +static job_type new_jobs_order[] = { + // fighters + JOB_FIGHTER, JOB_GLADIATOR, + JOB_MONK, JOB_BERSERKER, + // religious professions (incl. Berserker above) + JOB_PALADIN, JOB_PRIEST, + JOB_HEALER, JOB_CHAOS_KNIGHT, + JOB_DEATH_KNIGHT, JOB_CRUSADER, + // general and niche spellcasters (incl. Crusader above) + JOB_REAVER, JOB_WARPER, + JOB_WIZARD, JOB_CONJURER, + JOB_ENCHANTER, JOB_SUMMONER, + JOB_NECROMANCER, JOB_TRANSMUTER, + JOB_FIRE_ELEMENTALIST, JOB_ICE_ELEMENTALIST, + JOB_AIR_ELEMENTALIST, JOB_EARTH_ELEMENTALIST, + // poison specialists and stabbers + JOB_VENOM_MAGE, JOB_STALKER, + JOB_THIEF, JOB_ASSASSIN, + JOB_HUNTER, JOB_ARTIFICER, + JOB_WANDERER +}; + +job_type get_class(const int index) +{ + if (index < 0 || (unsigned int) index >= ARRAYSZ(old_jobs_order)) + return (JOB_UNKNOWN); + + return (Options.use_old_selection_order? old_jobs_order[index] + : new_jobs_order[index]); +} + +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", "Ar" }; + +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", "Artificer" }; + +int get_class_index_by_abbrev( const char *abbrev ) +{ + COMPILE_CHECK(ARRAYSZ(Class_Abbrev_List) == NUM_JOBS, c1); + + unsigned int job; + for (unsigned int i = 0; i < ARRAYSZ(old_jobs_order); i++) + { + 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_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); +} + +int get_class_index_by_name( const char *name ) +{ + COMPILE_CHECK(ARRAYSZ(Class_Name_List) == NUM_JOBS, c1); + + char *ptr; + char lowered_buff[80]; + char lowered_class[80]; + + strncpy( lowered_buff, name, sizeof( lowered_buff ) ); + strlwr( lowered_buff ); + + int cl = -1; + unsigned int job; + for (unsigned int i = 0; i < ARRAYSZ(old_jobs_order); i++) + { + 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 ]); +} + +int get_class_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); +} + +int ng_num_classes() +{ + // The list musn't be longer than the number of actual classes. + COMPILE_CHECK(ARRAYSZ(old_jobs_order) <= NUM_JOBS, c1); + // Check whether the two lists have the same size. + COMPILE_CHECK(ARRAYSZ(old_jobs_order) == ARRAYSZ(new_jobs_order), c2); + return ARRAYSZ(old_jobs_order); +} + |