diff options
author | j-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573> | 2009-06-20 21:06:39 +0000 |
---|---|---|
committer | j-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573> | 2009-06-20 21:06:39 +0000 |
commit | 3884a47fb05f613b0cb617f09326b24b9a518576 (patch) | |
tree | 1865464950f23aaa2d41870ca61c55433eeeb65b /crawl-ref/source/tilepick.cc | |
parent | 3ad6e28a57ab9cdbe139e6de12fb8a25c19d86cb (diff) | |
download | crawl-ref-3884a47fb05f613b0cb617f09326b24b9a518576.tar.gz crawl-ref-3884a47fb05f613b0cb617f09326b24b9a518576.zip |
* Add player doll selection prompt ('-') into 0.5 branch.
* Handle Artificers in the job default setting.
* Update change log.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/branches/stone_soup-0.5@10009 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/tilepick.cc')
-rw-r--r-- | crawl-ref/source/tilepick.cc | 282 |
1 files changed, 159 insertions, 123 deletions
diff --git a/crawl-ref/source/tilepick.cc b/crawl-ref/source/tilepick.cc index 1a79526ac8..5fde337f23 100644 --- a/crawl-ref/source/tilepick.cc +++ b/crawl-ref/source/tilepick.cc @@ -2716,9 +2716,7 @@ static inline void _finalize_tile(unsigned int *tile, void tilep_calc_flags(const int parts[], int flag[]) { - int i; - - for (i = 0; i < TILEP_PART_MAX; i++) + for (unsigned i = 0; i < TILEP_PART_MAX; i++) flag[i] = TILEP_FLAG_NORMAL; if (parts[TILEP_PART_HELM] - 1 >= TILEP_HELM_HELM_OFS) @@ -2733,21 +2731,24 @@ void tilep_calc_flags(const int parts[], int flag[]) flag[TILEP_PART_BOOTS] = flag[TILEP_PART_LEG] = TILEP_FLAG_HIDE; flag[TILEP_PART_BODY] = TILEP_FLAG_CUT_NAGA; } - - if (parts[TILEP_PART_BASE] == TILEP_BASE_CENTAUR - || parts[TILEP_PART_BASE] == TILEP_BASE_CENTAUR + 1) + else if (parts[TILEP_PART_BASE] == TILEP_BASE_CENTAUR + || parts[TILEP_PART_BASE] == TILEP_BASE_CENTAUR + 1) { flag[TILEP_PART_BOOTS] = flag[TILEP_PART_LEG] = TILEP_FLAG_HIDE; flag[TILEP_PART_BODY] = TILEP_FLAG_CUT_CENTAUR; } - - if (parts[TILEP_PART_BASE] == TILEP_BASE_MERFOLK_WATER - || parts[TILEP_PART_BASE] == TILEP_BASE_MERFOLK_WATER + 1) + else if (parts[TILEP_PART_BASE] == TILEP_BASE_MERFOLK_WATER + || parts[TILEP_PART_BASE] == TILEP_BASE_MERFOLK_WATER + 1) { flag[TILEP_PART_BOOTS] = TILEP_FLAG_HIDE; flag[TILEP_PART_LEG] = TILEP_FLAG_HIDE; flag[TILEP_PART_SHADOW] = TILEP_FLAG_HIDE; } + else if (parts[TILEP_PART_BASE] >= TILEP_BASE_DRACONIAN + && parts[TILEP_PART_BASE] <= TILEP_BASE_DRACONIAN_WHITE + 1) + { + flag[TILEP_PART_HAIR] = flag[TILEP_PART_HELM] = TILEP_FLAG_HIDE; + } } /* @@ -2789,35 +2790,106 @@ static int _draconian_colour(int race, int level) return 0; } -void tilep_race_default(int race, int gender, int level, int *parts) +int get_gender_from_tile(int parts[]) +{ + return ((parts[TILEP_PART_BASE] + - tile_player_part_start[TILEP_PART_BASE]) % 2); +} + +int tilep_species_to_base_tile(int sp, int level) +{ + switch (sp) + { + case SP_HUMAN: + return TILEP_BASE_HUMAN; + case SP_ELF: + case SP_HIGH_ELF: + case SP_SLUDGE_ELF: + return TILEP_BASE_ELF; + case SP_DEEP_ELF: + return TILEP_BASE_DEEP_ELF; + case SP_MOUNTAIN_DWARF: + return TILEP_BASE_DWARF; + case SP_HALFLING: + return TILEP_BASE_HALFLING; + case SP_HILL_ORC: + return TILEP_BASE_ORC; + case SP_KOBOLD: + return TILEP_BASE_KOBOLD; + case SP_MUMMY: + return TILEP_BASE_MUMMY; + case SP_NAGA: + return TILEP_BASE_NAGA; + case SP_OGRE: + return TILEP_BASE_OGRE; + case SP_TROLL: + return TILEP_BASE_TROLL; + case SP_BASE_DRACONIAN: + case SP_RED_DRACONIAN: + case SP_WHITE_DRACONIAN: + case SP_GREEN_DRACONIAN: + case SP_YELLOW_DRACONIAN: + case SP_GREY_DRACONIAN: + case SP_BLACK_DRACONIAN: + case SP_PURPLE_DRACONIAN: + case SP_MOTTLED_DRACONIAN: + case SP_PALE_DRACONIAN: + { + const int colour_offset = _draconian_colour(sp, level); + return (TILEP_BASE_DRACONIAN + colour_offset * 2); + } + case SP_CENTAUR: + return TILEP_BASE_CENTAUR; + case SP_DEMIGOD: + return TILEP_BASE_DEMIGOD; + case SP_SPRIGGAN: + return TILEP_BASE_SPRIGGAN; + case SP_MINOTAUR: + return TILEP_BASE_MINOTAUR; + case SP_DEMONSPAWN: + return TILEP_BASE_DEMONSPAWN; + case SP_GHOUL: + return TILEP_BASE_GHOUL; + case SP_KENKU: + return TILEP_BASE_KENKU; + case SP_MERFOLK: + return TILEP_BASE_MERFOLK; + case SP_VAMPIRE: + return TILEP_BASE_VAMPIRE; + case SP_DEEP_DWARF: + return TILEP_BASE_DEEP_DWARF; + default: + return TILEP_BASE_HUMAN; + } +} + +void tilep_race_default(int sp, int gender, int level, int *parts) { - int result; - int hair; - int beard = 0; + if (gender == -1) + gender = get_gender_from_tile(parts); + + ASSERT(gender == TILEP_GENDER_MALE || gender == TILEP_GENDER_FEMALE); + int result = tilep_species_to_base_tile(sp, level) + gender; + int hair = 0; + int beard = 0; if (gender == TILEP_GENDER_MALE) hair = TILEP_HAIR_SHORT_BLACK; else hair = TILEP_HAIR_LONG_BLACK; - switch (race) + switch (sp) { - case SP_HUMAN: - result = TILEP_BASE_HUMAN; - break; case SP_ELF: case SP_HIGH_ELF: case SP_SLUDGE_ELF: - result = TILEP_BASE_ELF; - hair = TILEP_HAIR_ELF_YELLOW; + hair = TILEP_HAIR_ELF_YELLOW; break; case SP_DEEP_ELF: - result = TILEP_BASE_DEEP_ELF; - hair = TILEP_HAIR_ELF_WHITE; + hair = TILEP_HAIR_ELF_WHITE; break; case SP_HILL_DWARF: case SP_MOUNTAIN_DWARF: - result = TILEP_BASE_DWARF; if (gender == TILEP_GENDER_MALE) { hair = TILEP_HAIR_SHORT_RED; @@ -2829,32 +2901,18 @@ void tilep_race_default(int race, int gender, int level, int *parts) beard = TILEP_BEARD_SHORT_RED; } break; - case SP_HALFLING: - result = TILEP_BASE_HALFLING; - break; case SP_HILL_ORC: - result = TILEP_BASE_ORC; - hair = 0; + hair = 0; break; case SP_KOBOLD: - result = TILEP_BASE_KOBOLD; - hair = 0; + hair = 0; break; case SP_MUMMY: - result = TILEP_BASE_MUMMY; - hair = 0; - break; - case SP_NAGA: - result = TILEP_BASE_NAGA; - break; - case SP_OGRE: - result = TILEP_BASE_OGRE; + hair = 0; break; case SP_TROLL: - result = TILEP_BASE_TROLL; - hair = 0; + hair = 0; break; - case SP_BASE_DRACONIAN: case SP_RED_DRACONIAN: case SP_WHITE_DRACONIAN: @@ -2865,53 +2923,40 @@ void tilep_race_default(int race, int gender, int level, int *parts) case SP_PURPLE_DRACONIAN: case SP_MOTTLED_DRACONIAN: case SP_PALE_DRACONIAN: - hair = 0; + { + const int colour_offset = _draconian_colour(sp, level); + result = TILEP_BASE_DRACONIAN + colour_offset * 2; + hair = 0; + int st = tile_player_part_start[TILEP_PART_DRCHEAD]; + parts[TILEP_PART_DRCHEAD] = st + colour_offset; + if (player_mutation_level(MUT_BIG_WINGS)) { - int st = tile_player_part_start[TILEP_PART_DRCWING]; - parts[TILEP_PART_DRCWING] = st + _draconian_colour(race, level); + st = tile_player_part_start[TILEP_PART_DRCWING]; + parts[TILEP_PART_DRCWING] = st + colour_offset; } - - result = TILEP_BASE_DRACONIAN + _draconian_colour(race, level) * 2; - break; - - case SP_CENTAUR: - result = TILEP_BASE_CENTAUR; - break; - case SP_DEMIGOD: - result = TILEP_BASE_DEMIGOD; - break; - case SP_SPRIGGAN: - result = TILEP_BASE_SPRIGGAN; break; + } case SP_MINOTAUR: - result = TILEP_BASE_MINOTAUR; - hair = 0; + hair = 0; break; case SP_DEMONSPAWN: - result = TILEP_BASE_DEMONSPAWN; - hair = 0; + hair = 0; break; case SP_GHOUL: - result = TILEP_BASE_GHOUL; - hair = 0; - break; - case SP_KENKU: - result = TILEP_BASE_KENKU; + hair = 0; break; case SP_MERFOLK: result = player_in_water() ? TILEP_BASE_MERFOLK_WATER : TILEP_BASE_MERFOLK; break; case SP_VAMPIRE: - result = TILEP_BASE_VAMPIRE; if (gender == TILEP_GENDER_MALE) hair = TILEP_HAIR_ARAGORN; else hair = TILEP_HAIR_ARWEN; break; case SP_DEEP_DWARF: - result = TILEP_BASE_DEEP_DWARF; if (gender == TILEP_GENDER_MALE) { hair = TILEP_HAIR_SHORT_WHITE; @@ -2924,36 +2969,34 @@ void tilep_race_default(int race, int gender, int level, int *parts) } break; default: - result = TILEP_BASE_HUMAN; + // nothing to do break; } - if (gender == TILEP_GENDER_MALE) - result++; parts[TILEP_PART_BASE] = result; - parts[TILEP_PART_HAIR] = hair; - parts[TILEP_PART_BEARD] = beard; + // Don't overwrite doll parts defined elsewhere. + if (hair == 0 || parts[TILEP_PART_HAIR] == TILEP_SHOW_EQUIP) + parts[TILEP_PART_HAIR] = hair; + if (beard == 0 || parts[TILEP_PART_BEARD] == TILEP_SHOW_EQUIP) + parts[TILEP_PART_BEARD] = beard; parts[TILEP_PART_SHADOW] = TILEP_SHADOW_SHADOW; } void tilep_job_default(int job, int gender, int *parts) { - parts[TILEP_PART_CLOAK] = 0; - parts[TILEP_PART_BOOTS] = 0; - parts[TILEP_PART_LEG] = 0; - parts[TILEP_PART_BODY] = 0; - parts[TILEP_PART_ARM] = 0; - parts[TILEP_PART_HAND1] = 0; - parts[TILEP_PART_HAND2] = 0; - parts[TILEP_PART_HELM] = 0; + parts[TILEP_PART_CLOAK] = TILEP_SHOW_EQUIP; + parts[TILEP_PART_BOOTS] = TILEP_SHOW_EQUIP; + parts[TILEP_PART_LEG] = TILEP_SHOW_EQUIP; + parts[TILEP_PART_BODY] = TILEP_SHOW_EQUIP; + parts[TILEP_PART_ARM] = TILEP_SHOW_EQUIP; + parts[TILEP_PART_HAND1] = TILEP_SHOW_EQUIP; + parts[TILEP_PART_HAND2] = TILEP_SHOW_EQUIP; + parts[TILEP_PART_HELM] = TILEP_SHOW_EQUIP; switch (job) { case JOB_FIGHTER: - parts[TILEP_PART_BODY] = TILEP_SHOW_EQUIP; parts[TILEP_PART_LEG] = TILEP_LEG_METAL_SILVER; - parts[TILEP_PART_HAND2] = TILEP_SHOW_EQUIP; - parts[TILEP_PART_HAND1] = TILEP_SHOW_EQUIP; break; case JOB_CRUSADER: @@ -2963,8 +3006,6 @@ void tilep_job_default(int job, int gender, int *parts) parts[TILEP_PART_ARM] = TILEP_ARM_GLOVE_GRAY; parts[TILEP_PART_BOOTS] = TILEP_BOOTS_MIDDLE_GRAY; parts[TILEP_PART_CLOAK] = TILEP_CLOAK_BLUE; - parts[TILEP_PART_HAND1] = TILEP_SHOW_EQUIP; - parts[TILEP_PART_HAND2] = TILEP_SHOW_EQUIP; break; case JOB_PALADIN: @@ -2974,8 +3015,6 @@ void tilep_job_default(int job, int gender, int *parts) parts[TILEP_PART_ARM] = TILEP_ARM_GLOVE_GRAY; parts[TILEP_PART_BOOTS] = TILEP_BOOTS_MIDDLE_GRAY; parts[TILEP_PART_CLOAK] = TILEP_CLOAK_BLUE; - parts[TILEP_PART_HAND2] = TILEP_SHOW_EQUIP; - parts[TILEP_PART_HAND1] = TILEP_SHOW_EQUIP; break; case JOB_DEATH_KNIGHT: @@ -2984,7 +3023,6 @@ void tilep_job_default(int job, int gender, int *parts) parts[TILEP_PART_HELM] = TILEP_HELM_FHELM_OFS; parts[TILEP_PART_ARM] = TILEP_ARM_GLOVE_BLACK; parts[TILEP_PART_CLOAK] = TILEP_CLOAK_YELLOW; - parts[TILEP_PART_HAND1] = TILEP_SHOW_EQUIP; parts[TILEP_PART_HAND2] = TILEP_HAND2_BOOK_BLACK; break; @@ -2993,22 +3031,17 @@ void tilep_job_default(int job, int gender, int *parts) parts[TILEP_PART_LEG] = TILEP_LEG_METAL_GRAY; parts[TILEP_PART_HELM] = TILEP_HELM_FHELM_PLUME; parts[TILEP_PART_BOOTS] = TILEP_BOOTS_SHORT_BROWN; - parts[TILEP_PART_HAND1] = TILEP_SHOW_EQUIP; - parts[TILEP_PART_HAND2] = TILEP_SHOW_EQUIP; break; case JOB_BERSERKER: parts[TILEP_PART_BODY] = TILEP_BODY_ANIMAL_SKIN; parts[TILEP_PART_LEG] = TILEP_LEG_BELT_REDBROWN; - parts[TILEP_PART_HAND1] = TILEP_SHOW_EQUIP; - parts[TILEP_PART_HAND2] = TILEP_SHOW_EQUIP; break; case JOB_REAVER: parts[TILEP_PART_BODY] = TILEP_BODY_ROBE_BLACK_GOLD; parts[TILEP_PART_LEG] = TILEP_LEG_PANTS_BROWN; parts[TILEP_PART_HAND2] = TILEP_HAND2_BOOK_RED_DIM; - parts[TILEP_PART_HAND1] = TILEP_SHOW_EQUIP; parts[TILEP_PART_BOOTS] = TILEP_BOOTS_SHORT_BROWN; break; @@ -3055,7 +3088,6 @@ void tilep_job_default(int job, int gender, int *parts) case JOB_PRIEST: parts[TILEP_PART_BODY] = TILEP_BODY_ROBE_WHITE; parts[TILEP_PART_ARM] = TILEP_ARM_GLOVE_WHITE; - parts[TILEP_PART_HAND1] = TILEP_SHOW_EQUIP; parts[TILEP_PART_BOOTS] = TILEP_BOOTS_SHORT_BROWN; break; @@ -3158,7 +3190,6 @@ void tilep_job_default(int job, int gender, int *parts) break; case JOB_GLADIATOR: - parts[TILEP_PART_HAND1] = TILEP_SHOW_EQUIP; parts[TILEP_PART_HAND2] = TILEP_HAND2_SHIELD_ROUND2; if (gender == TILEP_GENDER_MALE) @@ -3177,17 +3208,19 @@ void tilep_job_default(int job, int gender, int *parts) case JOB_MONK: parts[TILEP_PART_BODY] = TILEP_BODY_MONK_BLACK; - parts[TILEP_PART_HAND1] = TILEP_SHOW_EQUIP; - parts[TILEP_PART_HAND2] = TILEP_SHOW_EQUIP; break; case JOB_WANDERER: parts[TILEP_PART_BODY] = TILEP_BODY_SHIRT_HAWAII; parts[TILEP_PART_LEG] = TILEP_LEG_PANTS_SHORT_BROWN; - parts[TILEP_PART_HAND1] = TILEP_SHOW_EQUIP; - parts[TILEP_PART_HAND2] = TILEP_SHOW_EQUIP; parts[TILEP_PART_BOOTS] = TILEP_BOOTS_MIDDLE_BROWN3; break; + + case JOB_ARTIFICER: + parts[TILEP_PART_HAND1] = TILEP_HAND1_SCEPTRE; + parts[TILEP_PART_BODY] = TILEP_BODY_LEATHER_ARMOUR3; + parts[TILEP_PART_LEG] = TILEP_LEG_PANTS_BLACK; + break; } } @@ -3206,7 +3239,7 @@ void tilep_part_to_str(int number, char *buf) //normal 2 digits buf[0] = '0' + (number/100) % 10; buf[1] = '0' + (number/ 10) % 10; - buf[2] = '0' + number % 10; + buf[2] = '0' + number % 10; } buf[3] ='\0'; } @@ -3220,7 +3253,7 @@ int tilep_str_to_part(char *str) if (str[0] == '*') return TILEP_SHOW_EQUIP; - //normal 2 digits + //normal 3 digits return atoi(str); } @@ -3251,7 +3284,6 @@ void tilep_scan_parts(char *fbuf, int *parts) int ccount = 0; for (int i = 0; parts_saved[i] != -1; i++) { - int idx; ccount = 0; int p = parts_saved[i]; @@ -3264,23 +3296,23 @@ void tilep_scan_parts(char *fbuf, int *parts) ibuf[ccount] = '\0'; gcount++; - idx = tilep_str_to_part(ibuf); + int idx = tilep_str_to_part(ibuf); if (p == TILEP_PART_BASE) - { - int p0 = (parts[p]-1) & (0xfe); - if (((1-idx) & 1) == 1) - p0++; - parts[p] = p0 + 1; - } - else if (idx == TILEP_SHOW_EQUIP) - parts[p] = TILEP_SHOW_EQUIP; - else if (idx < 0) + parts[p] = tilep_species_to_base_tile() + idx % 2; + else if (idx == 0) parts[p] = 0; - // TODO enne - is this right? did the old count end at idx not just subtotal? + else if (idx == TILEP_SHOW_EQUIP) + continue; else if (idx > tile_player_part_count[p]) - parts[p] = tile_player_part_count[p]; + parts[p] = tile_player_part_start[p]; else - parts[p] = idx; + { + int idx2 = tile_player_part_start[p] + idx - 1; + if (idx2 < TILE_MAIN_MAX || idx2 >= TILEP_PLAYER_MAX) + parts[p] = TILEP_SHOW_EQUIP; + else + parts[p] = idx2; + } } } @@ -3289,21 +3321,25 @@ void tilep_scan_parts(char *fbuf, int *parts) */ void tilep_print_parts(char *fbuf, int *parts) { - int i; char *ptr = fbuf; - for (i = 0; parts_saved[i] != -1; i++) + for (unsigned i = 0; parts_saved[i] != -1; ++i) { int p = parts_saved[i]; - if (p == TILEP_PART_BASE) // 0:female 1:male - { - sprintf(ptr, "%03d", parts[p]%2); - ptr += 3; - } + if (p == TILEP_PART_BASE) // 0: female 1: male + sprintf(ptr, "%03d", get_gender_from_tile(parts)); else { - tilep_part_to_str(parts[p], ptr); - ptr += 3; + int idx = parts[p]; + if (idx != 0 && idx != TILEP_SHOW_EQUIP) + { + idx = parts[p] - tile_player_part_start[p] + 1; + if (idx < 0 || idx > tile_player_part_count[p]) + idx = 0; + } + tilep_part_to_str(idx, ptr); } + ptr += 3; + *ptr = ':'; ptr++; } |