summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/tilepick.cc
diff options
context:
space:
mode:
authorennewalker <ennewalker@c06c8d41-db1a-0410-9941-cceddc491573>2008-09-12 03:55:34 +0000
committerennewalker <ennewalker@c06c8d41-db1a-0410-9941-cceddc491573>2008-09-12 03:55:34 +0000
commit7c1e0016bfbaf83edc7ced6c18525b02cef706e8 (patch)
tree77d315f9f55aba8bb2372974b17b8f7dbc26a1b6 /crawl-ref/source/tilepick.cc
parentb1c63e6499689b802d76caa64f766a36ec081ec2 (diff)
downloadcrawl-ref-7c1e0016bfbaf83edc7ced6c18525b02cef706e8.tar.gz
crawl-ref-7c1e0016bfbaf83edc7ced6c18525b02cef706e8.zip
Incorporating new tiles from Denzi/Mitsuhiro. Rings and amulets now have labels when identified. Centaurs/yaktaurs now display the weapon they're wielding (and look better too). Variations of weapons and armor (i.e. normal, shiny, randart) are now determined automatically from the tile definitions, rather than being hardcoded. Also, improved axe tiles.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6910 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/tilepick.cc')
-rw-r--r--crawl-ref/source/tilepick.cc205
1 files changed, 120 insertions, 85 deletions
diff --git a/crawl-ref/source/tilepick.cc b/crawl-ref/source/tilepick.cc
index 624a06f7b9..02afac3ca2 100644
--- a/crawl-ref/source/tilepick.cc
+++ b/crawl-ref/source/tilepick.cc
@@ -102,7 +102,27 @@ int tile_unseen_flag(const coord_def& gc)
}
}
-static int _tileidx_monster_base(const monsters* mon, bool detected)
+// Special case for *taurs which have a different tile
+// for when they have a bow.
+static int _bow_offset(const monsters *mon)
+{
+ int mon_wep = mon->inv[MSLOT_WEAPON];
+ if (mon_wep == NON_ITEM)
+ return 1;
+
+ switch (mitm[mon_wep].sub_type)
+ {
+ case WPN_BOW:
+ case WPN_LONGBOW:
+ case WPN_CROSSBOW:
+ case WPN_HAND_CROSSBOW:
+ return 0;
+ default:
+ return 1;
+ }
+}
+
+static int _tileidx_monster_base(const monsters *mon, bool detected)
{
int grid = grd(mon->pos());
bool in_water = (grid == DNGN_SHALLOW_WATER || grid == DNGN_DEEP_WATER);
@@ -120,7 +140,7 @@ static int _tileidx_monster_base(const monsters* mon, bool detected)
case MONS_GIANT_BAT:
return TILEP_MONS_GIANT_BAT;
case MONS_CENTAUR:
- return TILEP_MONS_CENTAUR;
+ return TILEP_MONS_CENTAUR + _bow_offset(mon);
case MONS_RED_DEVIL:
return TILEP_MONS_RED_DEVIL;
case MONS_ETTIN:
@@ -365,7 +385,7 @@ static int _tileidx_monster_base(const monsters* mon, bool detected)
case MONS_STORM_DRAGON:
return TILEP_MONS_STORM_DRAGON;
case MONS_YAKTAUR:
- return TILEP_MONS_YAKTAUR;
+ return TILEP_MONS_YAKTAUR + _bow_offset(mon);
case MONS_DEATH_YAK:
return TILEP_MONS_DEATH_YAK;
case MONS_ROCK_TROLL:
@@ -722,9 +742,9 @@ static int _tileidx_monster_base(const monsters* mon, bool detected)
case MONS_MUMMY_PRIEST:
return TILEP_MONS_MUMMY_PRIEST;
case MONS_CENTAUR_WARRIOR:
- return TILEP_MONS_CENTAUR_WARRIOR;
+ return TILEP_MONS_CENTAUR_WARRIOR + _bow_offset(mon);
case MONS_YAKTAUR_CAPTAIN:
- return TILEP_MONS_YAKTAUR_CAPTAIN;
+ return TILEP_MONS_YAKTAUR_CAPTAIN + _bow_offset(mon);
case MONS_KILLER_KLOWN:
return TILEP_MONS_KILLER_KLOWN;
case MONS_ELECTRIC_GOLEM:
@@ -968,25 +988,32 @@ static int _get_etype(const item_def &item)
}
}
-static int _tileidx_weapon(const item_def &item)
+static int _apply_variations(const item_def &item, int tile)
{
- static const int etable[4][4] = {
- {0, 0, 0, 0}, // No ego tile
- {0, 1, 1, 1}, // One ego tile
- {0, 1, 1, 2}, // Two ego tile
- {0, 1, 2, 3}
+ static const int etable[5][5] =
+ {
+ {0, 0, 0, 0, 0},
+ {0, 1, 1, 1, 1},
+ {0, 1, 1, 1, 2},
+ {0, 1, 1, 2, 3},
+ {0, 1, 2, 3, 4}
};
- int race = item.flags & ISFLAG_RACIAL_MASK;
int etype = _get_etype(item);
+ int idx = tile_main_count(tile) - 1;
+ ASSERT(idx < 5);
+ tile += etable[idx][etype];
- if (etype > 1)
- etype--;
+ return tile;
+}
+
+static int _tileidx_weapon_base(const item_def &item)
+{
+ int race = item.flags & ISFLAG_RACIAL_MASK;
switch (item.sub_type)
{
- case WPN_KNIFE:
- return TILE_WPN_KNIFE;
+ case WPN_KNIFE: return TILE_WPN_KNIFE;
case WPN_DAGGER:
if (race == ISFLAG_ORCISH)
@@ -1000,32 +1027,25 @@ static int _tileidx_weapon(const item_def &item)
return TILE_WPN_SHORT_SWORD_ORC;
if (race == ISFLAG_ELVEN)
return TILE_WPN_SHORT_SWORD_ELF;
- return TILE_WPN_SHORT_SWORD + etable[1][etype];
-
- case WPN_QUICK_BLADE:
- return TILE_WPN_QUICK_BLADE;
-
- case WPN_SABRE:
- return TILE_WPN_SABRE + etable[1][etype];
-
- case WPN_FALCHION:
- return TILE_WPN_FALCHION;
+ return TILE_WPN_SHORT_SWORD;
- case WPN_KATANA:
- return TILE_WPN_KATANA + etable[1][etype];
+ case WPN_QUICK_BLADE: return TILE_WPN_QUICK_BLADE;
+ case WPN_SABRE: return TILE_WPN_SABRE;
+ case WPN_FALCHION: return TILE_WPN_FALCHION;
+ case WPN_KATANA: return TILE_WPN_KATANA;
case WPN_LONG_SWORD:
if (race == ISFLAG_ORCISH)
return TILE_WPN_LONG_SWORD_ORC;
- return TILE_WPN_LONG_SWORD + etable[1][etype];
+ return TILE_WPN_LONG_SWORD;
case WPN_GREAT_SWORD:
if (race == ISFLAG_ORCISH)
return TILE_WPN_GREAT_SWORD_ORC;
- return TILE_WPN_GREAT_SWORD + etable[1][etype];
+ return TILE_WPN_GREAT_SWORD;
case WPN_SCIMITAR:
- return TILE_WPN_SCIMITAR + etable[1][etype];
+ return TILE_WPN_SCIMITAR;
case WPN_DOUBLE_SWORD:
return TILE_WPN_DOUBLE_SWORD;
@@ -1040,45 +1060,45 @@ static int _tileidx_weapon(const item_def &item)
return TILE_WPN_WAR_AXE;
case WPN_BROAD_AXE:
- return TILE_WPN_BROAD_AXE + etable[1][etype];
+ return TILE_WPN_BROAD_AXE;
case WPN_BATTLEAXE:
- return TILE_WPN_BATTLEAXE + etable[1][etype];
+ return TILE_WPN_BATTLEAXE;
case WPN_EXECUTIONERS_AXE:
- return TILE_WPN_EXECUTIONERS_AXE + etable[1][etype];
+ return TILE_WPN_EXECUTIONERS_AXE;
case WPN_BLOWGUN:
- return TILE_WPN_BLOWGUN + etable[1][etype];
+ return TILE_WPN_BLOWGUN;
case WPN_SLING:
return TILE_WPN_SLING;
case WPN_BOW:
- return TILE_WPN_BOW + etable[1][etype];
+ return TILE_WPN_BOW;
case WPN_CROSSBOW:
- return TILE_WPN_CROSSBOW + etable[1][etype];
+ return TILE_WPN_CROSSBOW;
case WPN_HAND_CROSSBOW:
- return TILE_WPN_HAND_CROSSBOW + etable[1][etype];
+ return TILE_WPN_HAND_CROSSBOW;
case WPN_SPEAR:
- return TILE_WPN_SPEAR + etable[1][etype];
+ return TILE_WPN_SPEAR;
case WPN_TRIDENT:
- return TILE_WPN_TRIDENT + etable[1][etype];
+ return TILE_WPN_TRIDENT;
case WPN_HALBERD:
- return TILE_WPN_HALBERD + etable[1][etype];
+ return TILE_WPN_HALBERD;
case WPN_SCYTHE:
- return TILE_WPN_SCYTHE + etable[1][etype];
+ return TILE_WPN_SCYTHE;
case WPN_GLAIVE:
if (race == ISFLAG_ORCISH)
return TILE_WPN_GLAIVE_ORC;
- return TILE_WPN_GLAIVE + etable[1][etype];
+ return TILE_WPN_GLAIVE;
case WPN_QUARTERSTAFF:
return TILE_WPN_QUARTERSTAFF;
@@ -1087,28 +1107,28 @@ static int _tileidx_weapon(const item_def &item)
return TILE_WPN_CLUB;
case WPN_HAMMER:
- return TILE_WPN_HAMMER + etable[1][etype];
+ return TILE_WPN_HAMMER;
case WPN_MACE:
- return TILE_WPN_MACE + etable[1][etype];
+ return TILE_WPN_MACE;
case WPN_FLAIL:
- return TILE_WPN_FLAIL + etable[1][etype];
+ return TILE_WPN_FLAIL;
case WPN_SPIKED_FLAIL:
- return TILE_WPN_SPIKED_FLAIL + etable[1][etype];
+ return TILE_WPN_SPIKED_FLAIL;
case WPN_GREAT_MACE:
- return TILE_WPN_GREAT_MACE + etable[1][etype];
+ return TILE_WPN_GREAT_MACE;
case WPN_DIRE_FLAIL:
- return TILE_WPN_GREAT_FLAIL + etable[1][etype];
+ return TILE_WPN_GREAT_FLAIL;
case WPN_MORNINGSTAR:
- return TILE_WPN_MORNINGSTAR + etable[1][etype];
+ return TILE_WPN_MORNINGSTAR;
case WPN_EVENINGSTAR:
- return TILE_WPN_EVENINGSTAR + etable[1][etype];
+ return TILE_WPN_EVENINGSTAR;
case WPN_GIANT_CLUB:
return TILE_WPN_GIANT_CLUB;
@@ -1138,7 +1158,7 @@ static int _tileidx_weapon(const item_def &item)
return TILE_WPN_LONGBOW;
case WPN_LAJATANG:
- return TILE_WPN_LAJATANG + etable[1][etype];
+ return TILE_WPN_LAJATANG;
case WPN_BARDICHE:
return TILE_WPN_LOCHABER_AXE;
@@ -1147,16 +1167,16 @@ static int _tileidx_weapon(const item_def &item)
return TILE_WPN_FALCHION;
case WPN_BLESSED_LONG_SWORD:
- return TILE_WPN_LONG_SWORD + etable[1][etype];
+ return TILE_WPN_LONG_SWORD;
case WPN_BLESSED_SCIMITAR:
- return TILE_WPN_SCIMITAR + etable[1][etype];
+ return TILE_WPN_SCIMITAR;
case WPN_BLESSED_KATANA:
- return TILE_WPN_KATANA + etable[1][etype];
+ return TILE_WPN_KATANA;
case WPN_BLESSED_GREAT_SWORD:
- return TILE_WPN_GREAT_SWORD + etable[1][etype];
+ return TILE_WPN_GREAT_SWORD;
case WPN_BLESSED_DOUBLE_SWORD:
return TILE_WPN_DOUBLE_SWORD;
@@ -1168,6 +1188,12 @@ static int _tileidx_weapon(const item_def &item)
return TILE_ERROR;
}
+static int _tileidx_weapon(const item_def &item)
+{
+ int tile = _tileidx_weapon_base(item);
+ return _apply_variations(item, tile);
+}
+
static int _tileidx_missile(const item_def &item)
{
int brand = item.special;
@@ -1195,31 +1221,21 @@ static int _tileidx_missile(const item_def &item)
return TILE_ERROR;
}
-static int _tileidx_armour(const item_def &item)
+static int _tileidx_armour_base(const item_def &item)
{
int race = item.flags & ISFLAG_RACIAL_MASK;
int type = item.sub_type;
- int etype = _get_etype(item);
-
- static const int etable[5][5] = {
- {0, 0, 0, 0, 0}, // No ego tile
- {0, 1, 1, 1, 1}, // One ego tile
- {0, 1, 1, 1, 2}, // Two ego tile
- {0, 1, 1, 2, 3},
- {0, 1, 2, 3, 4}
- };
-
switch(type)
{
case ARM_ROBE:
- return TILE_ARM_ROBE + etable[2][etype];
+ return TILE_ARM_ROBE;
case ARM_LEATHER_ARMOUR:
if (race == ISFLAG_ORCISH)
return TILE_ARM_LEATHER_ARMOUR_ORC;
if (race == ISFLAG_ELVEN)
return TILE_ARM_LEATHER_ARMOUR_ELF;
- return TILE_ARM_LEATHER_ARMOUR + etable[2][etype];
+ return TILE_ARM_LEATHER_ARMOUR;
case ARM_RING_MAIL:
if (race == ISFLAG_ORCISH)
@@ -1228,19 +1244,19 @@ static int _tileidx_armour(const item_def &item)
return TILE_ARM_RING_MAIL_ELF;
if (race == ISFLAG_DWARVEN)
return TILE_ARM_RING_MAIL_DWA;
- return TILE_ARM_RING_MAIL + etable[1][etype];
+ return TILE_ARM_RING_MAIL;
case ARM_SCALE_MAIL:
if (race == ISFLAG_ELVEN)
return TILE_ARM_SCALE_MAIL_ELF;
- return TILE_ARM_SCALE_MAIL + etable[1][etype];
+ return TILE_ARM_SCALE_MAIL;
case ARM_CHAIN_MAIL:
if (race == ISFLAG_ELVEN)
return TILE_ARM_CHAIN_MAIL_ELF;
if (race == ISFLAG_ORCISH)
return TILE_ARM_CHAIN_MAIL_ORC;
- return TILE_ARM_CHAIN_MAIL + etable[1][etype];
+ return TILE_ARM_CHAIN_MAIL;
case ARM_SPLINT_MAIL:
return TILE_ARM_SPLINT_MAIL;
@@ -1257,40 +1273,40 @@ static int _tileidx_armour(const item_def &item)
return TILE_ARM_CRYSTAL_PLATE_MAIL;
case ARM_SHIELD:
- return TILE_ARM_SHIELD + etable[2][etype];
+ return TILE_ARM_SHIELD;
case ARM_CLOAK:
- return TILE_ARM_CLOAK + etable[3][etype];
+ return TILE_ARM_CLOAK;
case ARM_WIZARD_HAT:
- return TILE_THELM_WIZARD_HAT + etable[1][etype];
+ return TILE_THELM_WIZARD_HAT;
case ARM_CAP:
return TILE_THELM_CAP;
case ARM_HELMET:
- return TILE_THELM_HELM + etable[3][etype];
+ return TILE_THELM_HELM;
case ARM_GLOVES:
- return TILE_ARM_GLOVES + etable[3][etype];
+ return TILE_ARM_GLOVES;
case ARM_BOOTS:
- return TILE_ARM_BOOTS + etable[3][etype];
+ return TILE_ARM_BOOTS;
case ARM_BUCKLER:
- return TILE_ARM_BUCKLER + etable[1][etype];
+ return TILE_ARM_BUCKLER;
case ARM_LARGE_SHIELD:
- return TILE_ARM_LARGE_SHIELD + etable[2][etype];
+ return TILE_ARM_LARGE_SHIELD;
case ARM_CENTAUR_BARDING:
- return TILE_ARM_CENTAUR_BARDING + etable[3][etype];
+ return TILE_ARM_CENTAUR_BARDING;
case ARM_NAGA_BARDING:
- return TILE_ARM_NAGA_BARDING + etable[3][etype];
+ return TILE_ARM_NAGA_BARDING;
case ARM_ANIMAL_SKIN:
- return TILE_ARM_ANIMAL_SKIN + etable[1][etype];
+ return TILE_ARM_ANIMAL_SKIN;
case ARM_TROLL_HIDE:
return TILE_ARM_TROLL_HIDE;
@@ -1344,6 +1360,12 @@ static int _tileidx_armour(const item_def &item)
return TILE_ERROR;
}
+static int _tileidx_armour(const item_def &item)
+{
+ int tile = _tileidx_armour_base(item);
+ return _apply_variations(item, tile);
+}
+
static int _tileidx_food(const item_def &item)
{
switch (item.sub_type)
@@ -1820,13 +1842,19 @@ int tileidx_item(const item_def &item)
return TILE_GOLD;
case OBJ_JEWELLERY:
-
- if (type < AMU_RAGE)
+ if (type < NUM_RINGS)
{
if (is_random_artefact( item ))
return TILE_RING_RANDOM_OFFSET + color - 1;
+ else if (id[ IDTYPE_JEWELLERY][type] == ID_KNOWN_TYPE
+ || (item.flags & ISFLAG_KNOW_TYPE))
+ {
+ return TILE_RING_REGENERATION + type - RING_FIRST_RING;
+ }
else
+ {
return TILE_RING_NORMAL_OFFSET + special % 13;
+ }
}
else
{
@@ -1834,8 +1862,15 @@ int tileidx_item(const item_def &item)
return _tileidx_unrand_artefact(find_unrandart_index(item));
else if (is_random_artefact( item ))
return TILE_AMU_RANDOM_OFFSET + color - 1;
+ else if (id[ IDTYPE_JEWELLERY][type] == ID_KNOWN_TYPE
+ || (item.flags & ISFLAG_KNOW_TYPE))
+ {
+ return TILE_AMU_RAGE + type - AMU_FIRST_AMULET;
+ }
else
+ {
return TILE_AMU_NORMAL_OFFSET + special % 13;
+ }
}
case OBJ_POTIONS: