summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/tilepick.cc
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2009-06-20 21:06:39 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2009-06-20 21:06:39 +0000
commit3884a47fb05f613b0cb617f09326b24b9a518576 (patch)
tree1865464950f23aaa2d41870ca61c55433eeeb65b /crawl-ref/source/tilepick.cc
parent3ad6e28a57ab9cdbe139e6de12fb8a25c19d86cb (diff)
downloadcrawl-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.cc282
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++;
}