summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Vollmert <rvollmert@gmx.net>2009-11-04 10:04:17 +0100
committerRobert Vollmert <rvollmert@gmx.net>2009-11-04 16:50:18 +0100
commit6f10cd2574eeb8a1417eff84718edd309287ac0d (patch)
tree69a45fe0e35cb559a3285b08697c96c230fc0c0f
parent9ad85435681ad82c7ef07d2083e40e525e2b0f55 (diff)
downloadcrawl-ref-6f10cd2574eeb8a1417eff84718edd309287ac0d.tar.gz
crawl-ref-6f10cd2574eeb8a1417eff84718edd309287ac0d.zip
Get rid of multiple-meaning "int object" in env.show.
env.show is now a class show_def that stores tagged unions of type show_type. For the moment, there's also env.show_los for use in LOS determination, but that should become an array of boolean at some point. This breaks save compatibility. Tiles and console version build and appear to work fine, but this kind of change is likely to have some side-effects.
-rw-r--r--crawl-ref/source/acr.cc6
-rw-r--r--crawl-ref/source/chardump.cc4
-rw-r--r--crawl-ref/source/cloud.cc75
-rw-r--r--crawl-ref/source/cloud.h1
-rw-r--r--crawl-ref/source/command.cc6
-rw-r--r--crawl-ref/source/directn.cc7
-rw-r--r--crawl-ref/source/enum.h33
-rw-r--r--crawl-ref/source/env.h9
-rw-r--r--crawl-ref/source/exclude.cc4
-rw-r--r--crawl-ref/source/externs.h15
-rw-r--r--crawl-ref/source/feature.cc829
-rw-r--r--crawl-ref/source/feature.h22
-rw-r--r--crawl-ref/source/files.cc2
-rw-r--r--crawl-ref/source/initfile.cc5
-rw-r--r--crawl-ref/source/l_debug.cc2
-rw-r--r--crawl-ref/source/l_dgngrd.cc4
-rw-r--r--crawl-ref/source/libgui.cc4
-rw-r--r--crawl-ref/source/los.cc10
-rw-r--r--crawl-ref/source/makefile.obj1
-rw-r--r--crawl-ref/source/mon-behv.cc25
-rw-r--r--crawl-ref/source/mon-util.cc2
-rw-r--r--crawl-ref/source/overmap.cc3
-rw-r--r--crawl-ref/source/show.cc224
-rw-r--r--crawl-ref/source/show.h98
-rw-r--r--crawl-ref/source/spells2.cc6
-rw-r--r--crawl-ref/source/stuff.cc2
-rw-r--r--crawl-ref/source/tags.cc20
-rw-r--r--crawl-ref/source/tags.h4
-rw-r--r--crawl-ref/source/terrain.cc11
-rw-r--r--crawl-ref/source/terrain.h1
-rw-r--r--crawl-ref/source/tilepick.cc33
-rw-r--r--crawl-ref/source/tiles.h4
-rw-r--r--crawl-ref/source/tilesdl.cc6
-rw-r--r--crawl-ref/source/travel.cc10
-rw-r--r--crawl-ref/source/travel.h2
-rw-r--r--crawl-ref/source/tutorial.cc30
-rw-r--r--crawl-ref/source/view.cc403
-rw-r--r--crawl-ref/source/view.h10
-rw-r--r--crawl-ref/source/xom.cc4
39 files changed, 1016 insertions, 921 deletions
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index 8b876b1cb5..7ced21d0a1 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -3525,13 +3525,13 @@ static bool _initialise(void)
seed_rng();
get_typeid_array().init(ID_UNKNOWN_TYPE);
init_char_table(Options.char_set);
- init_feature_table();
+ init_show_table();
init_monster_symbols();
init_spell_descs(); // This needs to be way up top. {dlb}
init_mon_name_cache();
// init_item_name_cache() needs to be redone after init_char_table()
- // and init_feature_table() have been called, so that the glyphs will
+ // and init_show_table() have been called, so that the glyphs will
// be set to use with item_names_by_glyph_cache.
init_item_name_cache();
@@ -3680,7 +3680,7 @@ static bool _initialise(void)
// In case Lua changed the character set.
init_char_table(Options.char_set);
- init_feature_table();
+ init_show_table();
init_monster_symbols();
#endif
diff --git a/crawl-ref/source/chardump.cc b/crawl-ref/source/chardump.cc
index 335f0e4386..0787629f40 100644
--- a/crawl-ref/source/chardump.cc
+++ b/crawl-ref/source/chardump.cc
@@ -1261,7 +1261,7 @@ void dump_map(FILE *fp, bool debug)
char_table_bk = Options.char_table;
init_char_table(CSET_ASCII);
- init_feature_table();
+ init_show_table();
if (debug)
{
@@ -1306,7 +1306,7 @@ void dump_map(FILE *fp, bool debug)
// Restore char and feature tables
Options.char_table = char_table_bk;
- init_feature_table();
+ init_show_table();
}
void dump_map(const char* fname, bool debug)
diff --git a/crawl-ref/source/cloud.cc b/crawl-ref/source/cloud.cc
index 1916914ed1..04736fc968 100644
--- a/crawl-ref/source/cloud.cc
+++ b/crawl-ref/source/cloud.cc
@@ -14,6 +14,7 @@
#include "branch.h"
#include "cloud.h"
+#include "colour.h"
#include "coord.h"
#include "mapmark.h"
#include "ouch.h"
@@ -959,6 +960,80 @@ void cloud_struct::set_killer(killer_type _killer)
break;
}
}
+
+int get_cloud_colour(int cloudno)
+{
+ int which_colour = LIGHTGREY;
+ switch (env.cloud[cloudno].type)
+ {
+ case CLOUD_FIRE:
+ case CLOUD_FOREST_FIRE:
+ if (env.cloud[cloudno].decay <= 20)
+ which_colour = RED;
+ else if (env.cloud[cloudno].decay <= 40)
+ which_colour = LIGHTRED;
+ else if (one_chance_in(4))
+ which_colour = RED;
+ else if (one_chance_in(4))
+ which_colour = LIGHTRED;
+ else
+ which_colour = YELLOW;
+ break;
+
+ case CLOUD_STINK:
+ which_colour = GREEN;
+ break;
+
+ case CLOUD_COLD:
+ if (env.cloud[cloudno].decay <= 20)
+ which_colour = BLUE;
+ else if (env.cloud[cloudno].decay <= 40)
+ which_colour = LIGHTBLUE;
+ else if (one_chance_in(4))
+ which_colour = BLUE;
+ else if (one_chance_in(4))
+ which_colour = LIGHTBLUE;
+ else
+ which_colour = WHITE;
+ break;
+
+ case CLOUD_POISON:
+ which_colour = (one_chance_in(3) ? LIGHTGREEN : GREEN);
+ break;
+
+ case CLOUD_BLUE_SMOKE:
+ which_colour = LIGHTBLUE;
+ break;
+
+ case CLOUD_PURP_SMOKE:
+ which_colour = MAGENTA;
+ break;
+
+ case CLOUD_MIASMA:
+ case CLOUD_BLACK_SMOKE:
+ which_colour = DARKGREY;
+ break;
+
+ case CLOUD_RAIN:
+ case CLOUD_MIST:
+ which_colour = ETC_MIST;
+ break;
+
+ case CLOUD_CHAOS:
+ which_colour = ETC_RANDOM;
+ break;
+
+ case CLOUD_MUTAGENIC:
+ which_colour = ETC_MUTAGENIC;
+ break;
+
+ default:
+ which_colour = LIGHTGREY;
+ break;
+ }
+ return (which_colour);
+}
+
//////////////////////////////////////////////////////////////////////////
// Fog machine stuff
diff --git a/crawl-ref/source/cloud.h b/crawl-ref/source/cloud.h
index f9fa6d6d18..c94bd4af8d 100644
--- a/crawl-ref/source/cloud.h
+++ b/crawl-ref/source/cloud.h
@@ -63,6 +63,7 @@ int max_cloud_damage(cloud_type cl_type, int power = -1);
void in_a_cloud(void);
std::string cloud_name(cloud_type type);
+int get_cloud_colour(int cloudno);
bool is_damaging_cloud(cloud_type type, bool temp = false);
bool is_harmless_cloud(cloud_type type);
diff --git a/crawl-ref/source/command.cc b/crawl-ref/source/command.cc
index d9d94b83ee..0b117625df 100644
--- a/crawl-ref/source/command.cc
+++ b/crawl-ref/source/command.cc
@@ -2122,7 +2122,7 @@ static void _add_formatted_keyhelp(column_composer &cols)
"<lightgrey>/</lightgrey> : wands (e<w>V</w>oke)\n"
"<lightcyan>";
- get_item_symbol(DNGN_ITEM_BOOK, &ch, &colour);
+ get_show_symbol(show_type(SHOW_ITEM_BOOK), &ch, &colour);
item_types += static_cast<char>(ch);
item_types +=
"</lightcyan> : books (<w>r</w>ead, <w>M</w>emorise, <w>z</w>ap, <w>Z</w>ap)\n"
@@ -2289,12 +2289,12 @@ static void _add_formatted_tutorial_help(column_composer &cols)
"<red>\"</red> : amulets (<w>P</w>ut on and <w>R</w>emove)\n"
"<darkgrey>/</darkgrey> : wands (e<w>V</w>oke)\n"
"<lightcyan>";
- get_item_symbol(DNGN_ITEM_BOOK, &ch, &colour);
+ get_show_symbol(show_type(SHOW_ITEM_BOOK), &ch, &colour);
text << static_cast<char>(ch);
text << "</lightcyan> : books (<w>r</w>ead, <w>M</w>emorise and "
"<w>z</w>ap)\n"
"<brown>";
- get_item_symbol(DNGN_ITEM_STAVE, &ch, &colour);
+ get_show_symbol(show_type(SHOW_ITEM_STAVE), &ch, &colour);
text << static_cast<char>(ch);
text << "</brown> : staves, rods (<w>w</w>ield and e<w>v</w>oke)\n"
"\n"
diff --git a/crawl-ref/source/directn.cc b/crawl-ref/source/directn.cc
index b80eeb3199..9a981ded71 100644
--- a/crawl-ref/source/directn.cc
+++ b/crawl-ref/source/directn.cc
@@ -46,6 +46,7 @@
#include "mon-util.h"
#include "player.h"
#include "shopping.h"
+#include "show.h"
#include "state.h"
#include "stuff.h"
#include "stash.h"
@@ -689,10 +690,10 @@ void full_describe_view()
std::string desc = "";
#ifndef USE_TILE
const coord_def e = c - you.pos() + coord_def(9,9);
- unsigned short col = env.show_col(e);;
- int object = env.show(e);
+ show_type object = env.show(e);
+ unsigned short col = object.colour;
unsigned ch;
- get_item_symbol( object, &ch, &col );
+ get_show_symbol(object, &ch, &col);
const std::string colour_str = colour_to_str(col);
desc = "(<" + colour_str + ">";
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index c9b4d0e43a..2deffd9793 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -1146,38 +1146,7 @@ enum dungeon_feature_type
DNGN_PERMADRY_FOUNTAIN,
DNGN_ABANDONED_SHOP,
- NUM_REAL_FEATURES, // 208
-
- // Real terrain must all occur before 256 to guarantee it fits
- // into the unsigned char used for the grid!
-
- // These aren't really terrain, but they're passed in and used
- // to get their appearance character so I'm putting them here for now.
- DNGN_ITEM_ORB = 256,
- DNGN_INVIS_EXPOSED = 257,
- DNGN_ITEM_WEAPON = 258,
- DNGN_ITEM_ARMOUR = 259,
- DNGN_ITEM_WAND = 260,
- DNGN_ITEM_FOOD = 261,
- DNGN_ITEM_UNUSED_1 = 262,
- DNGN_ITEM_SCROLL = 263,
- DNGN_ITEM_RING = 264,
- DNGN_ITEM_POTION = 265,
- DNGN_ITEM_MISSILE = 266,
- DNGN_ITEM_BOOK = 267,
- DNGN_ITEM_UNUSED_2 = 268,
- DNGN_ITEM_STAVE = 269,
- DNGN_ITEM_MISCELLANY = 270,
- DNGN_ITEM_CORPSE = 271,
- DNGN_ITEM_GOLD = 272,
- DNGN_ITEM_AMULET = 273,
- DNGN_ITEM_DETECTED = 274,
-
- DNGN_CLOUD = 280,
- NUM_FEATURES, // for use in lookup table in view.cc
-
- DNGN_RANDOM,
- DNGN_START_OF_MONSTERS = 297 // don't go past here! see view.cc
+ NUM_FEATURES // 208
};
enum duration_type
diff --git a/crawl-ref/source/env.h b/crawl-ref/source/env.h
index d4c70f74eb..32ce82e92a 100644
--- a/crawl-ref/source/env.h
+++ b/crawl-ref/source/env.h
@@ -2,6 +2,7 @@
#define ENV_H
#include "monster.h"
+#include "show.h"
class crawl_exit_hook;
@@ -22,16 +23,14 @@ public:
FixedArray< map_cell, GXM, GYM > map; // discovered terrain
- // Glyphs of squares that are in LOS.
- env_show_grid show;
+ // Objects that are in LOS, used for drawing.
+ show_def show;
+ env_show_grid show_los; // Compatibility. TODO: remove.
// What would be visible, if all of the translucent wall were
// made opaque.
env_show_grid no_trans_show;
- FixedArray<unsigned short, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER>
- show_col; // view window colour
-
#ifdef USE_TILE
// indexed by grid coords
FixedArray<tile_fg_store, GXM, GYM> tile_bk_fg;
diff --git a/crawl-ref/source/exclude.cc b/crawl-ref/source/exclude.cc
index f4ed190336..f9deb58f8b 100644
--- a/crawl-ref/source/exclude.cc
+++ b/crawl-ref/source/exclude.cc
@@ -95,8 +95,8 @@ struct opacity_excl : opacity_func
return OPC_CLEAR;
else if (!is_terrain_changed(p))
return _feat_opacity(env.grid(p));
- else if (env.map(p).object < NUM_REAL_FEATURES)
- return _feat_opacity((dungeon_feature_type) env.map(p).object);
+ else if (env.map(p).object.cls == SH_FEATURE)
+ return _feat_opacity(env.map(p).object.feat);
else
{
// If you have seen monsters, items or clouds there,
diff --git a/crawl-ref/source/externs.h b/crawl-ref/source/externs.h
index c064975b82..e2aab124d6 100644
--- a/crawl-ref/source/externs.h
+++ b/crawl-ref/source/externs.h
@@ -592,21 +592,6 @@ private:
int shot_damage(actor& act);
};
-struct map_cell
-{
- short object; // The object: monster, item, feature, or cloud.
- unsigned short flags; // Flags describing the mappedness of this square.
- unsigned short colour;
- unsigned long property; // Flags for blood, sanctuary, ...
-
- map_cell() : object(0), flags(0), colour(0), property(0) { }
- void clear() { flags = object = colour = 0; }
-
- unsigned glyph() const;
- bool known() const;
- bool seen() const;
-};
-
class map_marker;
class reader;
class writer;
diff --git a/crawl-ref/source/feature.cc b/crawl-ref/source/feature.cc
index 85eab18c94..97dd278c19 100644
--- a/crawl-ref/source/feature.cc
+++ b/crawl-ref/source/feature.cc
@@ -3,14 +3,25 @@
#include "feature.h"
#include "colour.h"
-#include "fixvec.h"
+#include "debug.h"
#include "options.h"
+#include "show.h"
-static FixedVector<feature_def, NUM_FEATURES> Feature;
+typedef std::map<show_type, feature_def> feat_map;
+static feat_map Features;
+
+const feature_def &get_feature_def(show_type object)
+{
+ return (Features[object]);
+}
const feature_def &get_feature_def(dungeon_feature_type feat)
{
- return (Feature[feat]);
+ ASSERT(feat < NUM_FEATURES);
+ show_type object;
+ object.cls = SH_FEATURE;
+ object.feat = feat;
+ return (Features[object]);
}
void apply_feature_overrides()
@@ -19,7 +30,7 @@ void apply_feature_overrides()
{
const feature_override &fov = Options.feature_overrides[i];
const feature_def &ofeat = fov.override;
- feature_def &feat = Feature[fov.feat];
+ feature_def &feat = Features[fov.object];
if (ofeat.symbol)
feat.symbol = ofeat.symbol;
@@ -38,355 +49,342 @@ void apply_feature_overrides()
}
}
-void init_feature_table(void)
+void _init_feat(feature_def &f, dungeon_feature_type feat)
{
- for (int i = 0; i < NUM_FEATURES; i++)
+ switch(feat)
{
- Feature[i].dchar = NUM_DCHAR_TYPES;
- Feature[i].symbol = 0;
- Feature[i].colour = BLACK; // means must be set some other way
- Feature[i].flags = FFT_NONE;
- Feature[i].magic_symbol = 0; // set to symbol if unchanged
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = BLACK; // -> no special seen map handling
- Feature[i].seen_em_colour = BLACK;
- Feature[i].em_colour = BLACK;
- Feature[i].minimap = MF_UNSEEN;
-
- switch (i)
- {
case DNGN_UNSEEN:
default:
break;
case DNGN_ROCK_WALL:
case DNGN_PERMAROCK_WALL:
- Feature[i].dchar = DCHAR_WALL;
- Feature[i].colour = ETC_ROCK;
- Feature[i].magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
- Feature[i].minimap = MF_WALL;
+ f.dchar = DCHAR_WALL;
+ f.colour = ETC_ROCK;
+ f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
+ f.minimap = MF_WALL;
break;
case DNGN_STONE_WALL:
- Feature[i].dchar = DCHAR_WALL;
- Feature[i].colour = ETC_STONE;
- Feature[i].magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
- Feature[i].minimap = MF_WALL;
+ f.dchar = DCHAR_WALL;
+ f.colour = ETC_STONE;
+ f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
+ f.minimap = MF_WALL;
break;
case DNGN_CLEAR_ROCK_WALL:
case DNGN_CLEAR_STONE_WALL:
case DNGN_CLEAR_PERMAROCK_WALL:
- Feature[i].dchar = DCHAR_WALL;
- Feature[i].magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
- Feature[i].colour = LIGHTCYAN;
- Feature[i].minimap = MF_WALL;
+ f.dchar = DCHAR_WALL;
+ f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
+ f.colour = LIGHTCYAN;
+ f.minimap = MF_WALL;
break;
case DNGN_TREES:
- Feature[i].dchar = DCHAR_TREES;
- Feature[i].magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
- Feature[i].colour = BLACK; // overridden later
- Feature[i].minimap = MF_WALL;
+ f.dchar = DCHAR_TREES;
+ f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
+ f.colour = BLACK; // overridden later
+ f.minimap = MF_WALL;
break;
case DNGN_OPEN_SEA:
#ifdef USE_TILE
- Feature[i].dchar = DCHAR_WAVY;
+ f.dchar = DCHAR_WAVY;
#else
- Feature[i].dchar = DCHAR_WALL;
+ f.dchar = DCHAR_WALL;
#endif
- Feature[i].colour = BLUE;
- Feature[i].minimap = MF_WATER;
+ f.colour = BLUE;
+ f.minimap = MF_WATER;
break;
case DNGN_OPEN_DOOR:
- Feature[i].dchar = DCHAR_DOOR_OPEN;
- Feature[i].colour = LIGHTGREY;
- Feature[i].minimap = MF_DOOR;
+ f.dchar = DCHAR_DOOR_OPEN;
+ f.colour = LIGHTGREY;
+ f.minimap = MF_DOOR;
break;
case DNGN_CLOSED_DOOR:
case DNGN_DETECTED_SECRET_DOOR:
- Feature[i].dchar = DCHAR_DOOR_CLOSED;
- Feature[i].colour = LIGHTGREY;
- Feature[i].minimap = MF_DOOR;
+ f.dchar = DCHAR_DOOR_CLOSED;
+ f.colour = LIGHTGREY;
+ f.minimap = MF_DOOR;
break;
case DNGN_METAL_WALL:
- Feature[i].dchar = DCHAR_WALL;
- Feature[i].colour = CYAN;
- Feature[i].magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
- Feature[i].minimap = MF_WALL;
+ f.dchar = DCHAR_WALL;
+ f.colour = CYAN;
+ f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
+ f.minimap = MF_WALL;
break;
case DNGN_SECRET_DOOR:
// Note: get_secret_door_appearance means this probably isn't used.
- Feature[i].dchar = DCHAR_WALL;
- Feature[i].colour = ETC_ROCK;
- Feature[i].magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
- Feature[i].minimap = MF_WALL;
+ f.dchar = DCHAR_WALL;
+ f.colour = ETC_ROCK;
+ f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
+ f.minimap = MF_WALL;
break;
case DNGN_GREEN_CRYSTAL_WALL:
- Feature[i].dchar = DCHAR_WALL;
- Feature[i].colour = GREEN;
- Feature[i].magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
- Feature[i].minimap = MF_WALL;
+ f.dchar = DCHAR_WALL;
+ f.colour = GREEN;
+ f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
+ f.minimap = MF_WALL;
break;
case DNGN_ORCISH_IDOL:
- Feature[i].dchar = DCHAR_STATUE;
- Feature[i].colour = BROWN; // same as clay golem, I hope that's okay
- Feature[i].minimap = MF_WALL;
+ f.dchar = DCHAR_STATUE;
+ f.colour = BROWN; // same as clay golem, I hope that's okay
+ f.minimap = MF_WALL;
break;
case DNGN_WAX_WALL:
- Feature[i].dchar = DCHAR_WALL;
- Feature[i].colour = YELLOW;
- Feature[i].magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
- Feature[i].minimap = MF_WALL;
+ f.dchar = DCHAR_WALL;
+ f.colour = YELLOW;
+ f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
+ f.minimap = MF_WALL;
break;
case DNGN_GRANITE_STATUE:
- Feature[i].dchar = DCHAR_STATUE;
- Feature[i].colour = DARKGREY;
- Feature[i].minimap = MF_WALL;
+ f.dchar = DCHAR_STATUE;
+ f.colour = DARKGREY;
+ f.minimap = MF_WALL;
break;
case DNGN_LAVA:
- Feature[i].dchar = DCHAR_WAVY;
- Feature[i].colour = RED;
- Feature[i].minimap = MF_LAVA;
+ f.dchar = DCHAR_WAVY;
+ f.colour = RED;
+ f.minimap = MF_LAVA;
break;
case DNGN_DEEP_WATER:
- Feature[i].dchar = DCHAR_WAVY;
- Feature[i].colour = BLUE;
- Feature[i].minimap = MF_WATER;
+ f.dchar = DCHAR_WAVY;
+ f.colour = BLUE;
+ f.minimap = MF_WATER;
break;
case DNGN_SHALLOW_WATER:
- Feature[i].dchar = DCHAR_WAVY;
- Feature[i].colour = CYAN;
- Feature[i].minimap = MF_WATER;
+ f.dchar = DCHAR_WAVY;
+ f.colour = CYAN;
+ f.minimap = MF_WATER;
break;
case DNGN_FLOOR:
- Feature[i].dchar = DCHAR_FLOOR;
- Feature[i].colour = ETC_FLOOR;
- Feature[i].magic_symbol = Options.char_table[ DCHAR_FLOOR_MAGIC ];
- Feature[i].minimap = MF_FLOOR;
+ f.dchar = DCHAR_FLOOR;
+ f.colour = ETC_FLOOR;
+ f.magic_symbol = Options.char_table[ DCHAR_FLOOR_MAGIC ];
+ f.minimap = MF_FLOOR;
break;
case DNGN_FLOOR_SPECIAL:
- Feature[i].dchar = DCHAR_FLOOR;
- Feature[i].colour = YELLOW;
- Feature[i].magic_symbol = Options.char_table[ DCHAR_FLOOR_MAGIC ];
- Feature[i].minimap = MF_FLOOR;
+ f.dchar = DCHAR_FLOOR;
+ f.colour = YELLOW;
+ f.magic_symbol = Options.char_table[ DCHAR_FLOOR_MAGIC ];
+ f.minimap = MF_FLOOR;
break;
case DNGN_EXIT_HELL:
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].colour = LIGHTRED;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].seen_colour = LIGHTRED;
- Feature[i].minimap = MF_STAIR_UP;
+ f.dchar = DCHAR_ARCH;
+ f.colour = LIGHTRED;
+ f.map_colour = LIGHTGREY;
+ f.seen_colour = LIGHTRED;
+ f.minimap = MF_STAIR_UP;
break;
case DNGN_ENTER_HELL:
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].colour = RED;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].seen_colour = RED;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.dchar = DCHAR_ARCH;
+ f.colour = RED;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = LIGHTGREY;
+ f.seen_colour = RED;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_TRAP_MECHANICAL:
- Feature[i].colour = LIGHTCYAN;
- Feature[i].dchar = DCHAR_TRAP;
- Feature[i].map_colour = LIGHTCYAN;
- Feature[i].minimap = MF_TRAP;
+ f.colour = LIGHTCYAN;
+ f.dchar = DCHAR_TRAP;
+ f.map_colour = LIGHTCYAN;
+ f.minimap = MF_TRAP;
break;
case DNGN_TRAP_MAGICAL:
- Feature[i].colour = MAGENTA;
- Feature[i].dchar = DCHAR_TRAP;
- Feature[i].map_colour = MAGENTA;
- Feature[i].minimap = MF_TRAP;
+ f.colour = MAGENTA;
+ f.dchar = DCHAR_TRAP;
+ f.map_colour = MAGENTA;
+ f.minimap = MF_TRAP;
break;
case DNGN_TRAP_NATURAL:
- Feature[i].colour = BROWN;
- Feature[i].dchar = DCHAR_TRAP;
- Feature[i].map_colour = BROWN;
- Feature[i].minimap = MF_TRAP;
+ f.colour = BROWN;
+ f.dchar = DCHAR_TRAP;
+ f.map_colour = BROWN;
+ f.minimap = MF_TRAP;
break;
case DNGN_UNDISCOVERED_TRAP:
- Feature[i].dchar = DCHAR_FLOOR;
- Feature[i].colour = ETC_FLOOR;
- Feature[i].magic_symbol = Options.char_table[ DCHAR_FLOOR_MAGIC ];
- Feature[i].minimap = MF_FLOOR;
+ f.dchar = DCHAR_FLOOR;
+ f.colour = ETC_FLOOR;
+ f.magic_symbol = Options.char_table[ DCHAR_FLOOR_MAGIC ];
+ f.minimap = MF_FLOOR;
break;
case DNGN_ENTER_SHOP:
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].colour = YELLOW;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].seen_colour = YELLOW;
- Feature[i].minimap = MF_FEATURE;
+ f.dchar = DCHAR_ARCH;
+ f.colour = YELLOW;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = LIGHTGREY;
+ f.seen_colour = YELLOW;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ABANDONED_SHOP:
- Feature[i].colour = LIGHTGREY;
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].minimap = MF_FLOOR;
+ f.colour = LIGHTGREY;
+ f.dchar = DCHAR_ARCH;
+ f.map_colour = LIGHTGREY;
+ f.minimap = MF_FLOOR;
break;
case DNGN_ENTER_LABYRINTH:
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].colour = CYAN;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].seen_colour = CYAN;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.dchar = DCHAR_ARCH;
+ f.colour = CYAN;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = LIGHTGREY;
+ f.seen_colour = CYAN;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_ENTER_PORTAL_VAULT:
- Feature[i].flags |= FFT_NOTABLE;
+ f.flags |= FFT_NOTABLE;
// fall through
case DNGN_EXIT_PORTAL_VAULT:
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].colour = ETC_SHIMMER_BLUE;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].seen_colour = ETC_SHIMMER_BLUE;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.dchar = DCHAR_ARCH;
+ f.colour = ETC_SHIMMER_BLUE;
+ f.map_colour = LIGHTGREY;
+ f.seen_colour = ETC_SHIMMER_BLUE;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_ESCAPE_HATCH_DOWN:
- Feature[i].dchar = DCHAR_STAIRS_DOWN;
- Feature[i].colour = BROWN;
- Feature[i].map_colour = BROWN;
- Feature[i].minimap = MF_STAIR_DOWN;
+ f.dchar = DCHAR_STAIRS_DOWN;
+ f.colour = BROWN;
+ f.map_colour = BROWN;
+ f.minimap = MF_STAIR_DOWN;
break;
case DNGN_STONE_STAIRS_DOWN_I:
case DNGN_STONE_STAIRS_DOWN_II:
case DNGN_STONE_STAIRS_DOWN_III:
- Feature[i].dchar = DCHAR_STAIRS_DOWN;
- Feature[i].colour = LIGHTGREY;
- Feature[i].em_colour = WHITE;
- Feature[i].map_colour = RED;
- Feature[i].seen_em_colour = WHITE;
- Feature[i].minimap = MF_STAIR_DOWN;
+ f.dchar = DCHAR_STAIRS_DOWN;
+ f.colour = LIGHTGREY;
+ f.em_colour = WHITE;
+ f.map_colour = RED;
+ f.seen_em_colour = WHITE;
+ f.minimap = MF_STAIR_DOWN;
break;
case DNGN_ESCAPE_HATCH_UP:
- Feature[i].dchar = DCHAR_STAIRS_UP;
- Feature[i].colour = BROWN;
- Feature[i].map_colour = BROWN;
- Feature[i].minimap = MF_STAIR_UP;
+ f.dchar = DCHAR_STAIRS_UP;
+ f.colour = BROWN;
+ f.map_colour = BROWN;
+ f.minimap = MF_STAIR_UP;
break;
case DNGN_STONE_STAIRS_UP_I:
case DNGN_STONE_STAIRS_UP_II:
case DNGN_STONE_STAIRS_UP_III:
- Feature[i].dchar = DCHAR_STAIRS_UP;
- Feature[i].colour = LIGHTGREY;
- Feature[i].map_colour = GREEN;
- Feature[i].em_colour = WHITE;
- Feature[i].seen_em_colour = WHITE;
- Feature[i].minimap = MF_STAIR_UP;
+ f.dchar = DCHAR_STAIRS_UP;
+ f.colour = LIGHTGREY;
+ f.map_colour = GREEN;
+ f.em_colour = WHITE;
+ f.seen_em_colour = WHITE;
+ f.minimap = MF_STAIR_UP;
break;
case DNGN_ENTER_DIS:
- Feature[i].colour = CYAN;
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].seen_colour = CYAN;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.colour = CYAN;
+ f.dchar = DCHAR_ARCH;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = LIGHTGREY;
+ f.seen_colour = CYAN;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_ENTER_GEHENNA:
- Feature[i].colour = RED;
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].seen_colour = RED;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.colour = RED;
+ f.dchar = DCHAR_ARCH;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = LIGHTGREY;
+ f.seen_colour = RED;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_ENTER_COCYTUS:
- Feature[i].colour = LIGHTCYAN;
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].seen_colour = LIGHTCYAN;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.colour = LIGHTCYAN;
+ f.dchar = DCHAR_ARCH;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = LIGHTGREY;
+ f.seen_colour = LIGHTCYAN;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_ENTER_TARTARUS:
- Feature[i].colour = DARKGREY;
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].seen_colour = DARKGREY;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.colour = DARKGREY;
+ f.dchar = DCHAR_ARCH;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = LIGHTGREY;
+ f.seen_colour = DARKGREY;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_ENTER_ABYSS:
- Feature[i].colour = ETC_RANDOM;
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].seen_colour = ETC_RANDOM;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.colour = ETC_RANDOM;
+ f.dchar = DCHAR_ARCH;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = LIGHTGREY;
+ f.seen_colour = ETC_RANDOM;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_EXIT_ABYSS:
- Feature[i].colour = ETC_RANDOM;
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].map_colour = ETC_RANDOM;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.colour = ETC_RANDOM;
+ f.dchar = DCHAR_ARCH;
+ f.map_colour = ETC_RANDOM;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_STONE_ARCH:
- Feature[i].colour = LIGHTGREY;
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].minimap = MF_FLOOR;
+ f.colour = LIGHTGREY;
+ f.dchar = DCHAR_ARCH;
+ f.map_colour = LIGHTGREY;
+ f.minimap = MF_FLOOR;
break;
case DNGN_ENTER_PANDEMONIUM:
- Feature[i].colour = LIGHTBLUE;
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].seen_colour = LIGHTBLUE;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.colour = LIGHTBLUE;
+ f.dchar = DCHAR_ARCH;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = LIGHTGREY;
+ f.seen_colour = LIGHTBLUE;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_EXIT_PANDEMONIUM:
// Note: Has special handling for colouring with mutation.
- Feature[i].colour = LIGHTBLUE;
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].seen_colour = LIGHTBLUE;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.colour = LIGHTBLUE;
+ f.dchar = DCHAR_ARCH;
+ f.map_colour = LIGHTGREY;
+ f.seen_colour = LIGHTBLUE;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_TRANSIT_PANDEMONIUM:
- Feature[i].colour = LIGHTGREEN;
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].seen_colour = LIGHTGREEN;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.colour = LIGHTGREEN;
+ f.dchar = DCHAR_ARCH;
+ f.map_colour = LIGHTGREY;
+ f.seen_colour = LIGHTGREEN;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_ENTER_ORCISH_MINES:
@@ -402,21 +400,21 @@ void init_feature_table(void)
case DNGN_ENTER_TOMB:
case DNGN_ENTER_SWAMP:
case DNGN_ENTER_SHOALS:
- Feature[i].colour = YELLOW;
- Feature[i].dchar = DCHAR_STAIRS_DOWN;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = RED;
- Feature[i].seen_colour = YELLOW;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.colour = YELLOW;
+ f.dchar = DCHAR_STAIRS_DOWN;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = RED;
+ f.seen_colour = YELLOW;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_ENTER_ZOT:
- Feature[i].colour = MAGENTA;
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].seen_colour = MAGENTA;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.colour = MAGENTA;
+ f.dchar = DCHAR_ARCH;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = LIGHTGREY;
+ f.seen_colour = MAGENTA;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_RETURN_FROM_ORCISH_MINES:
@@ -432,308 +430,319 @@ void init_feature_table(void)
case DNGN_RETURN_FROM_TOMB:
case DNGN_RETURN_FROM_SWAMP:
case DNGN_RETURN_FROM_SHOALS:
- Feature[i].colour = YELLOW;
- Feature[i].dchar = DCHAR_STAIRS_UP;
- Feature[i].map_colour = GREEN;
- Feature[i].seen_colour = YELLOW;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.colour = YELLOW;
+ f.dchar = DCHAR_STAIRS_UP;
+ f.map_colour = GREEN;
+ f.seen_colour = YELLOW;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_RETURN_FROM_ZOT:
- Feature[i].colour = MAGENTA;
- Feature[i].dchar = DCHAR_ARCH;
- Feature[i].map_colour = LIGHTGREY;
- Feature[i].seen_colour = MAGENTA;
- Feature[i].minimap = MF_STAIR_BRANCH;
+ f.colour = MAGENTA;
+ f.dchar = DCHAR_ARCH;
+ f.map_colour = LIGHTGREY;
+ f.seen_colour = MAGENTA;
+ f.minimap = MF_STAIR_BRANCH;
break;
case DNGN_ALTAR_ZIN:
- Feature[i].colour = WHITE;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = WHITE;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = WHITE;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = WHITE;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_SHINING_ONE:
- Feature[i].colour = YELLOW;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = YELLOW;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = YELLOW;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = YELLOW;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_KIKUBAAQUDGHA:
- Feature[i].colour = DARKGREY;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = DARKGREY;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = DARKGREY;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = DARKGREY;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_YREDELEMNUL:
- Feature[i].colour = ETC_UNHOLY;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = ETC_UNHOLY;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = ETC_UNHOLY;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = ETC_UNHOLY;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_XOM:
- Feature[i].colour = ETC_RANDOM;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = ETC_RANDOM;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = ETC_RANDOM;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = ETC_RANDOM;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_VEHUMET:
- Feature[i].colour = ETC_VEHUMET;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = ETC_VEHUMET;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = ETC_VEHUMET;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = ETC_VEHUMET;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_OKAWARU:
- Feature[i].colour = CYAN;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = CYAN;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = CYAN;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = CYAN;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_MAKHLEB:
- Feature[i].colour = ETC_FIRE;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = ETC_FIRE;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = ETC_FIRE;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = ETC_FIRE;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_SIF_MUNA:
- Feature[i].colour = BLUE;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = BLUE;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = BLUE;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = BLUE;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_TROG:
- Feature[i].colour = RED;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = RED;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = RED;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = RED;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_NEMELEX_XOBEH:
- Feature[i].colour = LIGHTMAGENTA;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = LIGHTMAGENTA;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = LIGHTMAGENTA;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = LIGHTMAGENTA;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_ELYVILON:
- Feature[i].colour = LIGHTGREY;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = LIGHTGREY;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = LIGHTGREY;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = LIGHTGREY;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_LUGONU:
- Feature[i].colour = MAGENTA;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = MAGENTA;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = MAGENTA;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = MAGENTA;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_BEOGH:
- Feature[i].colour = ETC_BEOGH;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = ETC_BEOGH;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = ETC_BEOGH;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = ETC_BEOGH;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_JIYVA:
- Feature[i].colour = ETC_SLIME;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = ETC_SLIME;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = ETC_SLIME;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = ETC_SLIME;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_FEAWN:
- Feature[i].colour = GREEN;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = GREEN;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = GREEN;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = GREEN;
+ f.minimap = MF_FEATURE;
break;
case DNGN_ALTAR_CHEIBRIADOS:
- Feature[i].colour = LIGHTCYAN;
- Feature[i].dchar = DCHAR_ALTAR;
- Feature[i].flags |= FFT_NOTABLE;
- Feature[i].map_colour = DARKGREY;
- Feature[i].seen_colour = LIGHTCYAN;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = LIGHTCYAN;
+ f.dchar = DCHAR_ALTAR;
+ f.flags |= FFT_NOTABLE;
+ f.map_colour = DARKGREY;
+ f.seen_colour = LIGHTCYAN;
+ f.minimap = MF_FEATURE;
break;
case DNGN_FOUNTAIN_BLUE:
- Feature[i].colour = BLUE;
- Feature[i].dchar = DCHAR_FOUNTAIN;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = BLUE;
+ f.dchar = DCHAR_FOUNTAIN;
+ f.minimap = MF_FEATURE;
break;
case DNGN_FOUNTAIN_SPARKLING:
- Feature[i].colour = LIGHTBLUE;
- Feature[i].dchar = DCHAR_FOUNTAIN;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = LIGHTBLUE;
+ f.dchar = DCHAR_FOUNTAIN;
+ f.minimap = MF_FEATURE;
break;
case DNGN_FOUNTAIN_BLOOD:
- Feature[i].colour = RED;
- Feature[i].dchar = DCHAR_FOUNTAIN;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = RED;
+ f.dchar = DCHAR_FOUNTAIN;
+ f.minimap = MF_FEATURE;
break;
case DNGN_DRY_FOUNTAIN_BLUE:
case DNGN_DRY_FOUNTAIN_SPARKLING:
case DNGN_DRY_FOUNTAIN_BLOOD:
case DNGN_PERMADRY_FOUNTAIN:
- Feature[i].colour = LIGHTGREY;
- Feature[i].dchar = DCHAR_FOUNTAIN;
- Feature[i].minimap = MF_FEATURE;
+ f.colour = LIGHTGREY;
+ f.dchar = DCHAR_FOUNTAIN;
+ f.minimap = MF_FEATURE;
break;
+ }
- case DNGN_INVIS_EXPOSED:
- Feature[i].dchar = DCHAR_INVIS_EXPOSED;
- Feature[i].minimap = MF_MONS_HOSTILE;
- break;
+ if (feat == DNGN_ENTER_ORCISH_MINES || feat == DNGN_ENTER_SLIME_PITS
+ || feat == DNGN_ENTER_LABYRINTH)
+ {
+ f.flags |= FFT_EXAMINE_HINT;
+ }
+}
- case DNGN_ITEM_DETECTED:
- Feature[i].dchar = DCHAR_ITEM_DETECTED;
- Feature[i].minimap = MF_ITEM;
+void _init_item(feature_def &f, show_item_type item)
+{
+ f.minimap = MF_ITEM;
+ switch (item)
+ {
+ case SHOW_ITEM_DETECTED:
+ f.dchar = DCHAR_ITEM_DETECTED;
break;
- case DNGN_ITEM_ORB:
- Feature[i].dchar = DCHAR_ITEM_ORB;
- Feature[i].minimap = MF_ITEM;
+ case SHOW_ITEM_ORB:
+ f.dchar = DCHAR_ITEM_ORB;
break;
- case DNGN_ITEM_WEAPON:
- Feature[i].dchar = DCHAR_ITEM_WEAPON;
- Feature[i].minimap = MF_ITEM;
+ case SHOW_ITEM_WEAPON:
+ f.dchar = DCHAR_ITEM_WEAPON;
break;
- case DNGN_ITEM_ARMOUR:
- Feature[i].dchar = DCHAR_ITEM_ARMOUR;
- Feature[i].minimap = MF_ITEM;
+ case SHOW_ITEM_ARMOUR:
+ f.dchar = DCHAR_ITEM_ARMOUR;
break;
- case DNGN_ITEM_WAND:
- Feature[i].dchar = DCHAR_ITEM_WAND;
- Feature[i].minimap = MF_ITEM;
+ case SHOW_ITEM_WAND:
+ f.dchar = DCHAR_ITEM_WAND;
break;
- case DNGN_ITEM_FOOD:
- Feature[i].dchar = DCHAR_ITEM_FOOD;
- Feature[i].minimap = MF_ITEM;
+ case SHOW_ITEM_FOOD:
+ f.dchar = DCHAR_ITEM_FOOD;
break;
- case DNGN_ITEM_SCROLL:
- Feature[i].dchar = DCHAR_ITEM_SCROLL;
- Feature[i].minimap = MF_ITEM;
+ case SHOW_ITEM_SCROLL:
+ f.dchar = DCHAR_ITEM_SCROLL;
break;
- case DNGN_ITEM_RING:
- Feature[i].dchar = DCHAR_ITEM_RING;
- Feature[i].minimap = MF_ITEM;
+ case SHOW_ITEM_RING:
+ f.dchar = DCHAR_ITEM_RING;
break;
- case DNGN_ITEM_POTION:
- Feature[i].dchar = DCHAR_ITEM_POTION;
- Feature[i].minimap = MF_ITEM;
+ case SHOW_ITEM_POTION:
+ f.dchar = DCHAR_ITEM_POTION;
break;
- case DNGN_ITEM_MISSILE:
- Feature[i].dchar = DCHAR_ITEM_MISSILE;
- Feature[i].minimap = MF_ITEM;
+ case SHOW_ITEM_MISSILE:
+ f.dchar = DCHAR_ITEM_MISSILE;
break;
- case DNGN_ITEM_BOOK:
- Feature[i].dchar = DCHAR_ITEM_BOOK;
- Feature[i].minimap = MF_ITEM;
+ case SHOW_ITEM_BOOK:
+ f.dchar = DCHAR_ITEM_BOOK;
break;
- case DNGN_ITEM_STAVE:
- Feature[i].dchar = DCHAR_ITEM_STAVE;
- Feature[i].minimap = MF_ITEM;
+ case SHOW_ITEM_STAVE:
+ f.dchar = DCHAR_ITEM_STAVE;
break;
- case DNGN_ITEM_MISCELLANY:
- Feature[i].dchar = DCHAR_ITEM_MISCELLANY;
- Feature[i].minimap = MF_ITEM;
+ case SHOW_ITEM_MISCELLANY:
+ f.dchar = DCHAR_ITEM_MISCELLANY;
break;
- case DNGN_ITEM_CORPSE:
- Feature[i].dchar = DCHAR_ITEM_CORPSE;
- Feature[i].minimap = MF_ITEM;
+ case SHOW_ITEM_CORPSE:
+ f.dchar = DCHAR_ITEM_CORPSE;
break;
- case DNGN_ITEM_GOLD:
- Feature[i].dchar = DCHAR_ITEM_GOLD;
- Feature[i].minimap = MF_ITEM;
+ case SHOW_ITEM_GOLD:
+ f.dchar = DCHAR_ITEM_GOLD;
break;
- case DNGN_ITEM_AMULET:
- Feature[i].dchar = DCHAR_ITEM_AMULET;
- Feature[i].minimap = MF_ITEM;
+ case SHOW_ITEM_AMULET:
+ f.dchar = DCHAR_ITEM_AMULET;
break;
+ }
+}
- case DNGN_CLOUD:
- Feature[i].dchar = DCHAR_CLOUD;
- Feature[i].minimap = MF_SKIP;
- break;
- }
+void init_show_table(void)
+{
+ show_type obj;
+ for (int i = 0; i < NUM_FEATURES; i++)
+ {
+ obj.cls = SH_FEATURE;
+ obj.feat = static_cast<dungeon_feature_type>(i);
- if (i == DNGN_ENTER_ORCISH_MINES || i == DNGN_ENTER_SLIME_PITS
- || i == DNGN_ENTER_LABYRINTH)
- {
- Feature[i].flags |= FFT_EXAMINE_HINT;
- }
+ _init_feat(Features[obj], obj.feat);
+ }
+
+ obj.cls = SH_INVIS_EXPOSED;
+ Features[obj].dchar = DCHAR_INVIS_EXPOSED;
+ Features[obj].minimap = MF_MONS_HOSTILE;
- if (Feature[i].dchar != NUM_DCHAR_TYPES)
- Feature[i].symbol = Options.char_table[ Feature[i].dchar ];
+ for (int i = 0; i < NUM_SHOW_ITEMS; i++)
+ {
+ obj.cls = SH_ITEM;
+ obj.item = static_cast<show_item_type>(i);
+
+ _init_item(Features[obj], obj.item);
}
- apply_feature_overrides();
+ obj.cls = SH_CLOUD;
+ Features[obj].dchar = DCHAR_CLOUD;
+ Features[obj].minimap = MF_SKIP;
- for (int i = 0; i < NUM_FEATURES; ++i)
+ for (feat_map::iterator i = Features.begin(); i != Features.end(); ++i)
{
- feature_def &f(Feature[i]);
+ feature_def &f = i->second;
+ if (f.dchar != NUM_DCHAR_TYPES)
+ f.symbol = Options.char_table[f.dchar];
+ }
+ apply_feature_overrides();
+
+ for (feat_map::iterator i = Features.begin(); i != Features.end(); ++i)
+ {
+ feature_def &f = i->second;
if (!f.magic_symbol)
f.magic_symbol = f.symbol;
diff --git a/crawl-ref/source/feature.h b/crawl-ref/source/feature.h
index f9a7115693..feda02a1a3 100644
--- a/crawl-ref/source/feature.h
+++ b/crawl-ref/source/feature.h
@@ -1,6 +1,8 @@
#ifndef FEATURE_H
#define FEATURE_H
+#include "show.h"
+
struct feature_def
{
dungeon_char_type dchar;
@@ -14,17 +16,31 @@ struct feature_def
unsigned flags;
map_feature minimap; // mini-map categorization
+ feature_def() :
+ dchar(NUM_DCHAR_TYPES),
+ symbol(0),
+ magic_symbol(0),
+ colour(BLACK),
+ map_colour(DARKGREY),
+ seen_colour(BLACK),
+ em_colour(BLACK),
+ seen_em_colour(BLACK),
+ flags(FFT_NONE),
+ minimap(MF_UNSEEN)
+ {}
+
bool is_notable() const { return (flags & FFT_NOTABLE); }
};
struct feature_override
{
- dungeon_feature_type feat;
- feature_def override;
+ show_type object;
+ feature_def override;
};
+const feature_def &get_feature_def(show_type object);
const feature_def &get_feature_def(dungeon_feature_type feat);
-void init_feature_table();
+void init_show_table();
#endif
diff --git a/crawl-ref/source/files.cc b/crawl-ref/source/files.cc
index 4dbcefceb9..e989cac4a2 100644
--- a/crawl-ref/source/files.cc
+++ b/crawl-ref/source/files.cc
@@ -1224,7 +1224,7 @@ bool load( dungeon_feature_type stair_taken, load_mode_type load_mode,
// Clear the show grid, to prevent us noticing things
// which were within the old LOS by new coordinates.
- env.show.init(0);
+ env.show_los.init(0);
// Try to open level savefile.
#ifdef DEBUG_LEVEL_LOAD
diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc
index 63416e0fc6..dc9c95b21a 100644
--- a/crawl-ref/source/initfile.cc
+++ b/crawl-ref/source/initfile.cc
@@ -1091,8 +1091,11 @@ void game_options::add_feature_override(const std::string &text)
for (int i = 0, size = feats.size(); i < size; ++i)
{
+ if (feats[i] >= NUM_FEATURES)
+ continue; // TODO: handle other object types.
feature_override fov;
- fov.feat = feats[i];
+ fov.object.cls = SH_FEATURE;
+ fov.object.feat = feats[i];
fov.override.symbol = read_symbol(iprops[0]);
fov.override.magic_symbol = read_symbol(iprops[1]);
diff --git a/crawl-ref/source/l_debug.cc b/crawl-ref/source/l_debug.cc
index d8cb466bae..a8fb968535 100644
--- a/crawl-ref/source/l_debug.cc
+++ b/crawl-ref/source/l_debug.cc
@@ -44,7 +44,7 @@ LUAFN(debug_flush_map_memory)
LUAFN(debug_generate_level)
{
no_messages mx;
- env.show.init(0);
+ env.show_los.init(0);
env.map.init(map_cell());
#ifdef USE_TILE
tile_init_default_flavour();
diff --git a/crawl-ref/source/l_dgngrd.cc b/crawl-ref/source/l_dgngrd.cc
index 39f33d76f5..e500326136 100644
--- a/crawl-ref/source/l_dgngrd.cc
+++ b/crawl-ref/source/l_dgngrd.cc
@@ -64,7 +64,7 @@ const char *dngn_feature_names[] =
dungeon_feature_type dungeon_feature_by_name(const std::string &name)
{
- COMPILE_CHECK(ARRAYSZ(dngn_feature_names) == NUM_REAL_FEATURES, c1);
+ COMPILE_CHECK(ARRAYSZ(dngn_feature_names) == NUM_FEATURES, c1);
if (name.empty())
return (DNGN_UNSEEN);
@@ -79,7 +79,7 @@ std::vector<std::string> dungeon_feature_matches(const std::string &name)
{
std::vector<std::string> matches;
- COMPILE_CHECK(ARRAYSZ(dngn_feature_names) == NUM_REAL_FEATURES, c1);
+ COMPILE_CHECK(ARRAYSZ(dngn_feature_names) == NUM_FEATURES, c1);
if (name.empty())
return (matches);
diff --git a/crawl-ref/source/libgui.cc b/crawl-ref/source/libgui.cc
index 721572327c..e00eb851e1 100644
--- a/crawl-ref/source/libgui.cc
+++ b/crawl-ref/source/libgui.cc
@@ -35,11 +35,11 @@
int tile_idx_unseen_terrain(int x, int y, int what)
{
const coord_def gc(x,y);
- unsigned int feature = grd(gc);
+ dungeon_feature_type feature = grd(gc);
unsigned int grid_symbol;
unsigned short grid_color;
- get_item_symbol(feature, &grid_symbol, &grid_color);
+ get_show_symbol(show_type(feature), &grid_symbol, &grid_color);
unsigned int t = tileidx_feature(feature, gc.x, gc.y);
if (t == TILE_ERROR || what == ' ')
diff --git a/crawl-ref/source/los.cc b/crawl-ref/source/los.cc
index 408d5e9ff0..6c0eb0936a 100644
--- a/crawl-ref/source/los.cc
+++ b/crawl-ref/source/los.cc
@@ -696,7 +696,7 @@ dungeon_feature_type ray_blocker(const coord_def& source,
if (!find_ray(source, target, ray, opc_default))
{
ASSERT (false);
- return (NUM_REAL_FEATURES);
+ return (NUM_FEATURES);
}
ray.advance();
@@ -709,7 +709,7 @@ dungeon_feature_type ray_blocker(const coord_def& source,
ray.advance();
}
ASSERT (false);
- return (NUM_REAL_FEATURES);
+ return (NUM_FEATURES);
}
// Returns a straight ray from source to target.
@@ -1001,7 +1001,7 @@ void calc_show_los()
{
if (!crawl_state.arena && !crawl_state.arena_suspended)
{
- losight(env.show, you.pos());
+ losight(env.show_los, you.pos());
// What would be visible, if all of the translucent walls were
// made opaque.
@@ -1010,7 +1010,7 @@ void calc_show_los()
}
else
{
- losight_permissive(env.show, crawl_view.glosc());
+ losight_permissive(env.show_los, crawl_view.glosc());
}
}
@@ -1036,7 +1036,7 @@ bool see_cell(const coord_def &p)
{
return (((crawl_state.arena || crawl_state.arena_suspended)
&& crawl_view.in_grid_los(p))
- || see_cell(env.show, you.pos(), p));
+ || see_cell(env.show_los, you.pos(), p));
}
// Answers the question: "Would a cell be within character's line of sight,
diff --git a/crawl-ref/source/makefile.obj b/crawl-ref/source/makefile.obj
index b47df8f2a3..fff4ef0229 100644
--- a/crawl-ref/source/makefile.obj
+++ b/crawl-ref/source/makefile.obj
@@ -116,6 +116,7 @@ religion.o \
rng.o \
sha256.o \
shopping.o \
+show.o \
skills.o \
skills2.o \
species.o \
diff --git a/crawl-ref/source/mon-behv.cc b/crawl-ref/source/mon-behv.cc
index f7be683b9b..4335854400 100644
--- a/crawl-ref/source/mon-behv.cc
+++ b/crawl-ref/source/mon-behv.cc
@@ -40,21 +40,18 @@ static void _check_lava_water_in_sight()
// XXX: remove explicit coordinate translation.
const coord_def ep = *ri - you.pos() + coord_def(ENV_SHOW_OFFSET,
ENV_SHOW_OFFSET);
- if (env.show(ep))
+ const dungeon_feature_type feat = grd(*ri);
+ if (feat == DNGN_LAVA)
{
- const dungeon_feature_type feat = grd(*ri);
- if (feat == DNGN_LAVA)
- {
- you.lava_in_sight = 1;
- if (you.water_in_sight > 0)
- break;
- }
- else if (feat == DNGN_DEEP_WATER)
- {
- you.water_in_sight = 1;
- if (you.lava_in_sight > 0)
- break;
- }
+ you.lava_in_sight = 1;
+ if (you.water_in_sight > 0)
+ break;
+ }
+ else if (feat == DNGN_DEEP_WATER)
+ {
+ you.water_in_sight = 1;
+ if (you.lava_in_sight > 0)
+ break;
}
}
}
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index 35ebd6a443..0cf2f20930 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -3226,7 +3226,7 @@ std::string do_mon_str_replacements(const std::string &in_msg,
if (see_cell(monster->pos()))
{
dungeon_feature_type feat = grd(monster->pos());
- if (feat < DNGN_MINMOVE || feat >= NUM_REAL_FEATURES)
+ if (feat < DNGN_MINMOVE || feat >= NUM_FEATURES)
msg = replace_all(msg, "@surface@", "buggy surface");
else if (feat == DNGN_LAVA)
msg = replace_all(msg, "@surface@", "lava");
diff --git a/crawl-ref/source/overmap.cc b/crawl-ref/source/overmap.cc
index 7c33da7f73..55cbbd2f05 100644
--- a/crawl-ref/source/overmap.cc
+++ b/crawl-ref/source/overmap.cc
@@ -64,8 +64,7 @@ static void _seen_staircase(dungeon_feature_type which_staircase,
static void _seen_other_thing(dungeon_feature_type which_thing,
const coord_def& pos);
-void seen_notable_thing( dungeon_feature_type which_thing,
- const coord_def& pos )
+void seen_notable_thing(dungeon_feature_type which_thing, const coord_def& pos)
{
// Tell the world first.
dungeon_events.fire_position_event(DET_PLAYER_IN_LOS, pos);
diff --git a/crawl-ref/source/show.cc b/crawl-ref/source/show.cc
new file mode 100644
index 0000000000..3a5e8908c4
--- /dev/null
+++ b/crawl-ref/source/show.cc
@@ -0,0 +1,224 @@
+#include "AppHdr.h"
+
+#include "show.h"
+
+#include "cloud.h"
+#include "coordit.h"
+#include "directn.h"
+#include "feature.h"
+#include "mon-util.h"
+#include "monster.h"
+#include "options.h"
+#include "state.h"
+#include "terrain.h"
+#include "view.h"
+
+void get_show_symbol(show_type object, unsigned *ch,
+ unsigned short *colour)
+{
+ if (object.cls < SH_MONSTER)
+ {
+ *ch = get_feature_def(object).symbol;
+
+ // Don't clobber with BLACK, because the colour should be already set.
+ if (get_feature_def(object).colour != BLACK)
+ *colour = get_feature_def(object).colour;
+ }
+ *colour = real_colour(*colour);
+}
+
+show_type::show_type(const monsters* m)
+ : cls(SH_MONSTER), mons(m->type) {}
+
+show_type::show_type(dungeon_feature_type f)
+ : cls(SH_FEATURE), feat(f) {}
+
+static show_item_type _item_to_show_code(const item_def &item);
+
+show_type::show_type(const item_def &it)
+ : cls(SH_ITEM), item(_item_to_show_code(it)) {}
+
+show_type::show_type(show_item_type t)
+ : cls(SH_ITEM), item(t) {}
+
+bool show_type::operator < (const show_type &other) const
+{
+ if (cls < other.cls)
+ return (false);
+ else if (cls > other.cls)
+ return (true);
+ switch (cls)
+ {
+ case SH_FEATURE:
+ return (feat < other.feat);
+ case SH_ITEM:
+ return (item < other.item);
+ case SH_MONSTER:
+ return (mons < other.mons);
+ default:
+ return (false);
+ }
+}
+
+void show_def::_set_backup(const coord_def &ep)
+{
+ backup(ep) = grid(ep);
+}
+
+void show_def::_update_feat_at(const coord_def &gp, const coord_def &ep)
+{
+ grid(ep).cls = SH_FEATURE;
+ grid(ep).feat = grid_appearance(gp);
+ grid(ep).colour = 0;
+}
+
+static show_item_type _item_to_show_code(const item_def &item)
+{
+ switch (item.base_type)
+ {
+ case OBJ_ORBS: return (SHOW_ITEM_ORB);
+ case OBJ_WEAPONS: return (SHOW_ITEM_WEAPON);
+ case OBJ_MISSILES: return (SHOW_ITEM_MISSILE);
+ case OBJ_ARMOUR: return (SHOW_ITEM_ARMOUR);
+ case OBJ_WANDS: return (SHOW_ITEM_WAND);
+ case OBJ_FOOD: return (SHOW_ITEM_FOOD);
+ case OBJ_SCROLLS: return (SHOW_ITEM_SCROLL);
+ case OBJ_JEWELLERY:
+ return (jewellery_is_amulet(item)? SHOW_ITEM_AMULET : SHOW_ITEM_RING);
+ case OBJ_POTIONS: return (SHOW_ITEM_POTION);
+ case OBJ_BOOKS: return (SHOW_ITEM_BOOK);
+ case OBJ_STAVES: return (SHOW_ITEM_STAVE);
+ case OBJ_MISCELLANY: return (SHOW_ITEM_MISCELLANY);
+ case OBJ_CORPSES: return (SHOW_ITEM_CORPSE);
+ case OBJ_GOLD: return (SHOW_ITEM_GOLD);
+ default: return (SHOW_ITEM_ORB); // bad item character
+ }
+}
+
+void show_def::_update_item_at(const coord_def &gp, const coord_def &ep)
+{
+ const item_def &eitem = mitm[igrd(gp)];
+ unsigned short &ecol = grid(ep).colour;
+
+ const dungeon_feature_type feat = grd(gp);
+ if (Options.feature_item_brand && is_critical_feature(feat))
+ ecol |= COLFLAG_FEATURE_ITEM;
+ else if (Options.trap_item_brand && feat_is_trap(feat))
+ ecol |= COLFLAG_TRAP_ITEM;
+ else
+ {
+ const unsigned short gcol = env.grid_colours(gp);
+ ecol = (feat == DNGN_SHALLOW_WATER) ?
+ (gcol != BLACK ? gcol : CYAN) : eitem.colour;
+ if (eitem.link != NON_ITEM && !crawl_state.arena)
+ ecol |= COLFLAG_ITEM_HEAP;
+ grid(ep).cls = SH_ITEM;
+ grid(ep).item = _item_to_show_code(eitem);
+ }
+
+#ifdef USE_TILE
+ int idx = igrd(gp);
+ if (feat_is_stair(feat))
+ tile_place_item_marker(ep.x, ep.y, idx);
+ else
+ tile_place_item(ep.x, ep.y, idx);
+#endif
+}
+
+void show_def::_update_cloud(int cloudno)
+{
+ const coord_def e = grid2show(env.cloud[cloudno].pos);
+ int which_colour = get_cloud_colour(cloudno);
+ _set_backup(e);
+ grid(e).cls = SH_CLOUD;
+ grid(e).colour = which_colour;
+
+#ifdef USE_TILE
+ tile_place_cloud(e.x, e.y, env.cloud[cloudno].type,
+ env.cloud[cloudno].decay);
+#endif
+}
+
+bool show_def::update_monster(const monsters* mons)
+{
+ const coord_def e = grid2show(mons->pos());
+
+ if (!mons->visible_to(&you))
+ {
+ // ripple effect?
+ if (grd(mons->pos()) == DNGN_SHALLOW_WATER
+ && !mons_flies(mons)
+ && env.cgrid(mons->pos()) == EMPTY_CLOUD)
+ {
+ _set_backup(e);
+ grid(e).cls = SH_INVIS_EXPOSED;
+
+ // Translates between colours used for shallow and deep water,
+ // if not using the normal LIGHTCYAN / BLUE. The ripple uses
+ // the deep water colour.
+ unsigned short base_colour = env.grid_colours(mons->pos());
+
+ static const unsigned short ripple_table[] =
+ {BLUE, // BLACK => BLUE (default)
+ BLUE, // BLUE => BLUE
+ GREEN, // GREEN => GREEN
+ CYAN, // CYAN => CYAN
+ RED, // RED => RED
+ MAGENTA, // MAGENTA => MAGENTA
+ BROWN, // BROWN => BROWN
+ DARKGREY, // LIGHTGREY => DARKGREY
+ DARKGREY, // DARKGREY => DARKGREY
+ BLUE, // LIGHTBLUE => BLUE
+ GREEN, // LIGHTGREEN => GREEN
+ BLUE, // LIGHTCYAN => BLUE
+ RED, // LIGHTRED => RED
+ MAGENTA, // LIGHTMAGENTA => MAGENTA
+ BROWN, // YELLOW => BROWN
+ LIGHTGREY}; // WHITE => LIGHTGREY
+
+ grid(e).colour = ripple_table[base_colour & 0x0f];
+ }
+ return (false);
+ }
+
+ // Mimics are always left on map.
+ if (!mons_is_mimic(mons->type))
+ _set_backup(e);
+
+ grid(e).cls = SH_MONSTER;
+ grid(e).mons = mons->type;
+ grid(e).colour = get_mons_colour(mons);
+
+ return (true);
+}
+
+void show_def::update_at(const coord_def &gp, const coord_def &ep)
+{
+ grid(ep).cls = SH_NOTHING;
+
+ // The sequence is grid, items, clouds, monsters.
+ _update_feat_at(gp, ep);
+
+ if (igrd(gp) != NON_ITEM)
+ _update_item_at(gp, ep);
+
+ const int cloud = env.cgrid(gp);
+ if (cloud != EMPTY_CLOUD && env.cloud[cloud].type != CLOUD_NONE
+ && env.cloud[cloud].pos == gp)
+ {
+ _update_cloud(cloud);
+ }
+
+ const monsters *mons = monster_at(gp);
+ if (mons && mons->alive())
+ update_monster(mons);
+}
+
+void show_def::init()
+{
+ grid.init(show_type());
+ backup.init(show_type());
+
+ for (radius_iterator ri(you.pos(), LOS_RADIUS); ri; ++ri)
+ update_at(*ri, grid2show(*ri));
+}
diff --git a/crawl-ref/source/show.h b/crawl-ref/source/show.h
new file mode 100644
index 0000000000..ea19d4485f
--- /dev/null
+++ b/crawl-ref/source/show.h
@@ -0,0 +1,98 @@
+#ifndef SHOW_H
+#define SHOW_H
+
+#include "fixary.h"
+
+enum show_item_type
+{
+ SHOW_ITEM_ORB,
+ SHOW_ITEM_WEAPON,
+ SHOW_ITEM_ARMOUR,
+ SHOW_ITEM_WAND,
+ SHOW_ITEM_FOOD,
+ SHOW_ITEM_SCROLL,
+ SHOW_ITEM_RING,
+ SHOW_ITEM_POTION,
+ SHOW_ITEM_MISSILE,
+ SHOW_ITEM_BOOK,
+ SHOW_ITEM_STAVE,
+ SHOW_ITEM_MISCELLANY,
+ SHOW_ITEM_CORPSE,
+ SHOW_ITEM_GOLD,
+ SHOW_ITEM_AMULET,
+ SHOW_ITEM_DETECTED,
+ NUM_SHOW_ITEMS
+};
+
+enum show_class
+{
+ SH_NOTHING,
+ SH_FEATURE,
+ SH_ITEM,
+ SH_CLOUD,
+ SH_INVIS_EXPOSED,
+ SH_MONSTER,
+ NUM_SHOW_CLASSES
+};
+
+struct show_type
+{
+ show_class cls;
+ union
+ {
+ dungeon_feature_type feat;
+ show_item_type item;
+ monster_type mons;
+ };
+ unsigned short colour;
+
+ show_type() : cls(SH_NOTHING), colour(0) {}
+ show_type(dungeon_feature_type f);
+ show_type(const item_def &item);
+ show_type(show_item_type itemtype);
+ show_type(const monsters* mons);
+
+ operator bool() const { return (cls != SH_NOTHING); }
+
+ bool operator < (const show_type &other) const;
+};
+
+struct map_cell
+{
+ show_type object; // The object: monster, item, feature, or cloud.
+ unsigned short flags; // Flags describing the mappedness of this square.
+ unsigned short colour;
+ unsigned long property; // Flags for blood, sanctuary, ...
+
+ map_cell() : object(), flags(0), colour(0), property(0) { }
+ void clear() { flags = colour = 0; object = show_type(); }
+
+ unsigned glyph() const;
+ bool known() const;
+ bool seen() const;
+};
+
+// Replaces get_item_symbol.
+void get_show_symbol(show_type object, unsigned *ch, unsigned short *colour);
+
+class monsters;
+class show_def
+{
+ FixedArray<show_type, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER> grid;
+ FixedArray<show_type, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER> backup;
+
+ void _update_feat_at(const coord_def &gp, const coord_def &ep);
+ void _update_item_at(const coord_def &gp, const coord_def &ep);
+ void _update_cloud(int cloudno);
+ void _set_backup(const coord_def &e);
+
+public:
+ show_type operator()(const coord_def &ep) const { return grid(ep); }
+ show_type get_backup(const coord_def &ep) const { return backup(ep); }
+
+ void init();
+ bool update_monster(const monsters *monster);
+ void update_at(const coord_def &gp, const coord_def &ep);
+};
+
+#endif
diff --git a/crawl-ref/source/spells2.cc b/crawl-ref/source/spells2.cc
index 660c5de06f..8d857c3f10 100644
--- a/crawl-ref/source/spells2.cc
+++ b/crawl-ref/source/spells2.cc
@@ -68,7 +68,7 @@ int detect_traps(int pow)
{
traps_found++;
trap.reveal();
- set_envmap_obj(trap.pos, grd(trap.pos));
+ set_envmap_obj(trap.pos, show_type(grd(trap.pos)));
set_terrain_mapped(trap.pos);
}
}
@@ -95,7 +95,7 @@ int detect_items(int pow)
{
items_found++;
- set_envmap_obj(*ri, DNGN_ITEM_DETECTED);
+ set_envmap_obj(*ri, show_type(SHOW_ITEM_DETECTED));
set_envmap_detected_item(*ri);
#ifdef USE_TILE
// Don't replace previously seen items with an unseen one.
@@ -170,7 +170,7 @@ static bool _mark_detected_creature(coord_def where, const monsters *mon,
where = place;
}
- set_envmap_obj(where, mon->type + DNGN_START_OF_MONSTERS);
+ set_envmap_obj(where, show_type(mon));
set_envmap_detected_mons(where);
#ifdef USE_TILE
diff --git a/crawl-ref/source/stuff.cc b/crawl-ref/source/stuff.cc
index ba3fd80765..3fefb11e7b 100644
--- a/crawl-ref/source/stuff.cc
+++ b/crawl-ref/source/stuff.cc
@@ -861,7 +861,7 @@ bool is_trap_square(dungeon_feature_type grid)
// applied to new games.
void zap_los_monsters()
{
- losight(env.show, you.pos());
+ losight(env.show_los, you.pos());
for (rectangle_iterator ri(crawl_view.vlos1, crawl_view.vlos2); ri; ++ri )
{
diff --git a/crawl-ref/source/tags.cc b/crawl-ref/source/tags.cc
index 9300e7329b..a05a0bd18a 100644
--- a/crawl-ref/source/tags.cc
+++ b/crawl-ref/source/tags.cc
@@ -1708,7 +1708,7 @@ static void tag_construct_level(writer &th)
for (int count_y = 0; count_y < GYM; count_y++)
{
marshallByte(th, grd[count_x][count_y]);
- marshallShort(th, env.map[count_x][count_y].object);
+ marshallShowtype(th, env.map[count_x][count_y].object);
marshallShort(th, env.map[count_x][count_y].colour);
marshallShort(th, env.map[count_x][count_y].flags);
marshallLong(th, env.map[count_x][count_y].property);
@@ -1810,6 +1810,22 @@ void unmarshallItem(reader &th, item_def &item)
item.props.read(th);
}
+void marshallShowtype(writer &th, const show_type &obj)
+{
+ marshallByte(th, obj.cls);
+ marshallShort(th, obj.feat); // union
+ marshallShort(th, obj.colour);
+}
+
+show_type unmarshallShowtype(reader &th)
+{
+ show_type obj;
+ obj.cls = static_cast<show_class>(unmarshallByte(th));
+ obj.feat = static_cast<dungeon_feature_type>(unmarshallShort(th));
+ obj.colour = unmarshallShort(th);
+ return (obj);
+}
+
static void tag_construct_level_items(writer &th)
{
// how many traps?
@@ -2073,7 +2089,7 @@ static void tag_read_level( reader &th, char minorVersion )
static_cast<dungeon_feature_type>(
static_cast<unsigned char>(unmarshallByte(th)) );
- env.map[i][j].object = unmarshallShort(th);
+ env.map[i][j].object = unmarshallShowtype(th);
env.map[i][j].colour = unmarshallShort(th);
env.map[i][j].flags = unmarshallShort(th);
env.map[i][j].property = unmarshallLong(th);
diff --git a/crawl-ref/source/tags.h b/crawl-ref/source/tags.h
index 3bb38318fd..ce2ec65a68 100644
--- a/crawl-ref/source/tags.h
+++ b/crawl-ref/source/tags.h
@@ -11,6 +11,8 @@
#include <stdint.h>
#include "externs.h"
+struct show_type;
+
enum tag_type // used during save/load process to identify data blocks
{
TAG_NO_TAG = 0, // should NEVER be read in!
@@ -92,6 +94,7 @@ void marshallString (writer &, const std::string &, int maxSize = 0);
void marshallString4 (writer &, const std::string &);
void marshallCoord (writer &, const coord_def &);
void marshallItem (writer &, const item_def &);
+void marshallShowtype (writer &, const show_type &);
/* ***********************************************************************
* reader API
@@ -124,6 +127,7 @@ std::string unmarshallString (reader &, int maxSize = 1000);
void unmarshallString4 (reader &, std::string&);
void unmarshallCoord (reader &, coord_def &c);
void unmarshallItem (reader &, item_def &item);
+show_type unmarshallShowtype (reader &);
/* ***********************************************************************
* Tag interface
diff --git a/crawl-ref/source/terrain.cc b/crawl-ref/source/terrain.cc
index a3b1e48ff3..47b66af04a 100644
--- a/crawl-ref/source/terrain.cc
+++ b/crawl-ref/source/terrain.cc
@@ -480,17 +480,6 @@ void get_door_description(int door_size, const char** adjective, const char** no
*noun = descriptions[idx+1];
}
-unsigned int show_appearance(const coord_def &ep)
-{
- unsigned int object = env.show(ep);
- const coord_def gc = show2grid(ep);
-
- if (object == DNGN_SECRET_DOOR)
- object = grid_secret_door_appearance(gc);
-
- return object;
-}
-
dungeon_feature_type grid_appearance(const coord_def &gc)
{
dungeon_feature_type feat = env.grid(gc);
diff --git a/crawl-ref/source/terrain.h b/crawl-ref/source/terrain.h
index 2c442ced2f..2bb3fb5d1e 100644
--- a/crawl-ref/source/terrain.h
+++ b/crawl-ref/source/terrain.h
@@ -62,7 +62,6 @@ void find_connected_range(coord_def d, dungeon_feature_type ft_min,
void get_door_description(int door_size, const char** adjective, const char** noun);
dungeon_feature_type grid_secret_door_appearance(const coord_def &where);
dungeon_feature_type grid_appearance(const coord_def &gc);
-unsigned int show_appearance(const coord_def &ep);
bool feat_destroys_items(dungeon_feature_type feat);
const char *feat_item_destruction_message( dungeon_feature_type feat );
diff --git a/crawl-ref/source/tilepick.cc b/crawl-ref/source/tilepick.cc
index 9e43162d58..8b696a0ae5 100644
--- a/crawl-ref/source/tilepick.cc
+++ b/crawl-ref/source/tilepick.cc
@@ -2343,11 +2343,9 @@ static int _tileidx_shop(coord_def where)
}
}
-int tileidx_feature(int object, int gx, int gy)
+int tileidx_feature(dungeon_feature_type feat, int gx, int gy)
{
- ASSERT(object < NUM_REAL_FEATURES);
-
- switch (object)
+ switch (feat)
{
case DNGN_UNSEEN:
return TILE_DNGN_UNSEEN;
@@ -2363,7 +2361,7 @@ int tileidx_feature(int object, int gx, int gy)
const dungeon_feature_type appear
= grid_secret_door_appearance(coord_def(gx, gy));
ASSERT(!feat_is_secret_door(appear));
- return tileidx_feature((int) appear, gx, gy);
+ return tileidx_feature(appear, gx, gy);
}
case DNGN_CLEAR_ROCK_WALL:
case DNGN_CLEAR_STONE_WALL:
@@ -2553,9 +2551,9 @@ int tileidx_feature(int object, int gx, int gy)
case DNGN_DRY_FOUNTAIN_BLOOD:
case DNGN_PERMADRY_FOUNTAIN:
return TILE_DNGN_DRY_FOUNTAIN;
+ default:
+ return TILE_DNGN_ERROR;
}
-
- return TILE_DNGN_ERROR;
}
static int _tileidx_cloud(int type, int decay)
@@ -4534,18 +4532,15 @@ void tile_draw_floor()
const coord_def gc = show2grid(ep);
int bg = TILE_DNGN_UNSEEN | tile_unseen_flag(gc);
- int object = show_appearance(ep);
- if (object != 0 && map_bounds(gc))
+ if (env.show_los(ep))
{
- bg = tileidx_feature(object, gc.x, gc.y);
+ dungeon_feature_type feat = grid_appearance(gc);
+ bg = tileidx_feature(feat, gc.x, gc.y);
- if (in_bounds(gc))
- {
- if (object == DNGN_DETECTED_SECRET_DOOR)
- bg |= TILE_FLAG_WAS_SECRET;
- else if (is_unknown_stair(gc))
- bg |= TILE_FLAG_NEW_STAIR;
- }
+ if (feat == DNGN_DETECTED_SECRET_DOOR)
+ bg |= TILE_FLAG_WAS_SECRET;
+ else if (is_unknown_stair(gc))
+ bg |= TILE_FLAG_NEW_STAIR;
}
// init tiles
@@ -4673,11 +4668,11 @@ void tile_place_monster(int gx, int gy, int idx, bool foreground, bool detected)
// features.
if (is_terrain_mapped(gc))
{
- unsigned int feature = grd(gc);
+ dungeon_feature_type feature = grd(gc);
unsigned int grid_symbol;
unsigned short grid_colour;
- get_item_symbol(feature, &grid_symbol, &grid_colour);
+ get_show_symbol(show_type(feature), &grid_symbol, &grid_colour);
unsigned int fg;
unsigned int bg;
diff --git a/crawl-ref/source/tiles.h b/crawl-ref/source/tiles.h
index 3f588cb86b..9c3cf7d8ce 100644
--- a/crawl-ref/source/tiles.h
+++ b/crawl-ref/source/tiles.h
@@ -14,6 +14,7 @@
#include "beam.h"
#include "enum.h"
+#include "show.h"
enum tag_version
{
@@ -33,8 +34,7 @@ struct demon_data
//*tile1.cc: get data from core part and drives tile drawing codes
//**convert in-game data to tile index
-int tileidx(unsigned int object, int extra);
-int tileidx_feature(int object, int gx, int gy);
+int tileidx_feature(dungeon_feature_type feat, int gx, int gy);
int tileidx_player(int job);
void tileidx_unseen(unsigned int &fg, unsigned int &bg, int ch,
const coord_def& gc);
diff --git a/crawl-ref/source/tilesdl.cc b/crawl-ref/source/tilesdl.cc
index 376f1dc620..59dae41a82 100644
--- a/crawl-ref/source/tilesdl.cc
+++ b/crawl-ref/source/tilesdl.cc
@@ -1310,9 +1310,9 @@ void TilesFramework::update_minimap(int gx, int gy)
if (!player_in_mappable_area())
return;
- int object = env.map[gx][gy].object;
- map_feature f = (object >= DNGN_START_OF_MONSTERS) ? MF_MONS_HOSTILE :
- get_feature_def((dungeon_feature_type)object).minimap;
+ show_type object = env.map[gx][gy].object;
+ map_feature f = (object.cls == SH_MONSTER) ? MF_MONS_HOSTILE :
+ get_feature_def(object).minimap;
if (f == MF_SKIP)
f = get_feature_def(grd[gx][gy]).minimap;
diff --git a/crawl-ref/source/travel.cc b/crawl-ref/source/travel.cc
index 967ef627d5..99cd5bc7bf 100644
--- a/crawl-ref/source/travel.cc
+++ b/crawl-ref/source/travel.cc
@@ -232,7 +232,7 @@ inline bool is_player_altar(const coord_def &c)
bool is_unknown_stair(const coord_def &p, dungeon_feature_type remembered_feat)
{
- dungeon_feature_type feat = (remembered_feat == NUM_REAL_FEATURES)
+ dungeon_feature_type feat = (remembered_feat == NUM_FEATURES)
? env.grid(p) : remembered_feat;
return (feat_is_travelable_stair(feat) && !travel_cache.know_stair(p));
}
@@ -349,14 +349,14 @@ bool is_travelsafe_square(const coord_def& c, bool ignore_hostile,
// Also make note of what's displayed on the level map for
// plant/fungus checks.
- const int levelmap_object = get_envmap_obj(c);
+ const show_type levelmap_object = get_envmap_obj(c);
// Travel will not voluntarily cross squares blocked by immobile monsters.
if (!ignore_hostile
- && levelmap_object >= DNGN_START_OF_MONSTERS
+ && levelmap_object.cls == SH_MONSTER
&& _is_monster_blocked(c)
// _is_monster_blocked can only return true if monster_at(c) != NULL
- && monster_at(c)->type == levelmap_object - DNGN_START_OF_MONSTERS)
+ && monster_at(c)->type == levelmap_object.mons)
{
return (false);
}
@@ -481,7 +481,7 @@ void travel_init_new_level()
// Sets up travel-related stuff.
void initialise_travel()
{
- for (int feat = DNGN_FLOOR_MIN; feat < NUM_REAL_FEATURES; feat++)
+ for (int feat = DNGN_FLOOR_MIN; feat < NUM_FEATURES; feat++)
{
if (feat >= DNGN_TRAP_MECHANICAL && feat <= DNGN_TRAP_NATURAL)
continue;
diff --git a/crawl-ref/source/travel.h b/crawl-ref/source/travel.h
index 2b08a3841f..22afdfee8a 100644
--- a/crawl-ref/source/travel.h
+++ b/crawl-ref/source/travel.h
@@ -68,7 +68,7 @@ const char *trap_name(const coord_def &p);
void explore_pickup_event(int did_pickup, int tried_pickup);
bool feat_is_traversable(dungeon_feature_type feat);
bool is_unknown_stair(const coord_def &p,
- dungeon_feature_type remembered_feat = NUM_REAL_FEATURES);
+ dungeon_feature_type remembered_feat = NUM_FEATURES);
void find_travel_pos(const coord_def& youpos, char *move_x, char *move_y,
std::vector<coord_def>* coords = NULL);
diff --git a/crawl-ref/source/tutorial.cc b/crawl-ref/source/tutorial.cc
index 1e037c9832..2965d15190 100644
--- a/crawl-ref/source/tutorial.cc
+++ b/crawl-ref/source/tutorial.cc
@@ -1669,7 +1669,7 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc)
const coord_def e = gc - you.pos() + coord_def(9,9);
unsigned ch;
unsigned short colour;
- int object;
+ show_type object;
#endif
Options.tut_just_triggered = true;
@@ -1716,7 +1716,7 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc)
#ifndef USE_TILE
text << "('<w>";
- get_item_symbol(DNGN_ITEM_BOOK, &ch, &colour);
+ get_show_symbol(show_type(SHOW_ITEM_BOOK), &ch, &colour);
text << static_cast<char>(ch)
<< "'</w>) "
<< "that you can read by typing <w>r</w>. "
@@ -1971,7 +1971,7 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc)
#ifndef USE_TILE
", both of which are represented by '<w>";
- get_item_symbol(DNGN_ITEM_STAVE, &ch, &colour);
+ get_show_symbol(show_type(SHOW_ITEM_STAVE), &ch, &colour);
text << static_cast<char>(ch)
<< "</w>'"
#endif
@@ -2021,8 +2021,8 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc)
DELAY_EVENT;
object = env.show(e);
- colour = env.show_col(e);
- { unsigned short dummy; get_item_symbol( object, &ch, &dummy ); }
+ colour = object.colour;
+ { unsigned short dummy; get_show_symbol( object, &ch, &dummy ); }
text << _colourize_glyph(colour, ch) << " ";
#else
@@ -2052,8 +2052,8 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc)
text << "These ";
#ifndef USE_TILE
object = env.show(e);
- colour = env.show_col(e);
- get_item_symbol( object, &ch, &colour );
+ colour = object.colour;
+ get_show_symbol( object, &ch, &colour );
text << _colourize_glyph(colour, ch);
text << " ";
@@ -2081,8 +2081,8 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc)
// FIXME: Branch entrance character is not being colored yellow.
object = env.show(e);
- colour = env.show_col(e);
- { unsigned short dummy; get_item_symbol( object, &ch, &dummy ); }
+ colour = object.colour;
+ { unsigned short dummy; get_show_symbol( object, &ch, &dummy ); }
text << _colourize_glyph(colour, ch) << " ";
#else
@@ -2119,8 +2119,8 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc)
DELAY_EVENT;
object = env.show(e);
- colour = env.show_col(e);
- { unsigned short dummy; get_item_symbol( object, &ch, &dummy ); }
+ colour = object.colour;
+ { unsigned short dummy; get_show_symbol( object, &ch, &dummy ); }
text << _colourize_glyph(colour, ch) << " ";
#else
@@ -2192,8 +2192,8 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc)
"of these nasty constructions";
#ifndef USE_TILE
object = env.show(e);
- colour = env.show_col(e);
- get_item_symbol( object, &ch, &colour );
+ colour = object.colour;
+ get_show_symbol( object, &ch, &colour );
if (ch == ' ' || colour == BLACK)
colour = LIGHTCYAN;
@@ -2209,8 +2209,8 @@ void learned_something_new(tutorial_event_type seen_what, coord_def gc)
text << "That ";
#ifndef USE_TILE
object = env.show(e);
- colour = env.show_col(e);
- get_item_symbol( object, &ch, &colour );
+ colour = object.colour;
+ get_show_symbol( object, &ch, &colour );
text << _colourize_glyph(colour, ch) << " ";
#else
{
diff --git a/crawl-ref/source/view.cc b/crawl-ref/source/view.cc
index 057591bbba..87e18225a7 100644
--- a/crawl-ref/source/view.cc
+++ b/crawl-ref/source/view.cc
@@ -88,26 +88,20 @@
#define MC_MONS 0x02
crawl_view_geometry crawl_view;
-FixedArray < unsigned int, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER > Show_Backup;
extern int stealth; // defined in acr.cc
screen_buffer_t colour_code_map( const coord_def& p, bool item_colour = false,
bool travel_colour = false, bool on_level = true );
-void cloud_grid(void);
-void monster_grid(bool do_updates);
-
static void _get_symbol( const coord_def& where,
- int object, unsigned *ch,
+ show_type object, unsigned *ch,
unsigned short *colour,
bool magic_mapped = false );
-static unsigned _get_symbol(int object, unsigned short *colour = NULL,
+static unsigned _get_symbol(show_type object, unsigned short *colour = NULL,
bool magic_mapped = false);
-static int _get_item_dngn_code(const item_def &item);
-static void _set_show_backup( int ex, int ey );
-static int _get_viewobj_flags(int viewobj);
+static int _get_viewobj_flags(show_type viewobj);
unsigned map_cell::glyph() const
{
@@ -141,7 +135,7 @@ unsigned get_envmap_char(int x, int y)
return env.map[x][y].glyph();
}
-int get_envmap_obj(int x, int y)
+show_type get_envmap_obj(int x, int y)
{
return (env.map[x][y].object);
}
@@ -172,7 +166,7 @@ bool is_envmap_detected_mons(int x, int y)
return (env.map[x][y].flags & MAP_DETECTED_MONSTER);
}
-void set_envmap_glyph(int x, int y, int object, int col)
+void set_envmap_glyph(int x, int y, show_type object, int col)
{
map_cell &c = env.map[x][y];
c.object = object;
@@ -182,12 +176,12 @@ void set_envmap_glyph(int x, int y, int object, int col)
#endif
}
-void set_envmap_glyph(const coord_def& c, int object, int col)
+void set_envmap_glyph(const coord_def& c, show_type object, int col)
{
set_envmap_glyph(c.x, c.y, object, col);
}
-void set_envmap_obj( const coord_def& where, int obj )
+void set_envmap_obj(const coord_def& where, show_type obj)
{
env.map(where).object = obj;
#ifdef USE_TILE
@@ -398,14 +392,14 @@ unsigned real_colour(unsigned raw_colour)
return (raw_colour);
}
-static int _get_viewobj_flags(int object)
+static int _get_viewobj_flags(show_type object)
{
// Check for monster glyphs.
- if (object >= DNGN_START_OF_MONSTERS)
+ if (object.cls == SH_MONSTER)
return (MC_MONS);
// Check for item glyphs.
- if (object >= DNGN_ITEM_ORB && object < DNGN_CLOUD)
+ if (object.cls == SH_ITEM)
return (MC_ITEM);
// We don't care to look further; we could check for
@@ -413,7 +407,7 @@ static int _get_viewobj_flags(int object)
return (0);
}
-static unsigned _get_symbol(int object, unsigned short *colour,
+static unsigned _get_symbol(show_type object, unsigned short *colour,
bool magic_mapped)
{
unsigned ch;
@@ -450,24 +444,23 @@ static unsigned short _tree_colour(const coord_def& where)
}
static void _get_symbol( const coord_def& where,
- int object, unsigned *ch,
+ show_type object, unsigned *ch,
unsigned short *colour,
bool magic_mapped )
{
ASSERT( ch != NULL );
- if (object < NUM_FEATURES)
+ if (object.cls < SH_MONSTER)
{
- const dungeon_feature_type feat =
- static_cast<dungeon_feature_type>(object);
- const feature_def &fdef = get_feature_def(feat);
+ const feature_def &fdef = get_feature_def(object);
*ch = magic_mapped? fdef.magic_symbol
: fdef.symbol;
// Don't recolor items
- if (colour && object < NUM_REAL_FEATURES)
+ if (colour && object.cls == SH_FEATURE)
{
+ dungeon_feature_type feat = object.feat;
const int colmask = *colour & COLFLAG_MASK;
// TODO: consolidate with feat_is_stair etc.
@@ -553,13 +546,14 @@ static void _get_symbol( const coord_def& where,
// Note anything we see that's notable
if (!where.origin() && fdef.is_notable())
{
- seen_notable_thing(feat, where);
+ if (object.cls == SH_FEATURE) // other notable things?
+ seen_notable_thing(object.feat, where);
}
}
else
{
- ASSERT(object >= DNGN_START_OF_MONSTERS);
- *ch = mons_char(object - DNGN_START_OF_MONSTERS);
+ ASSERT(object.cls == SH_MONSTER);
+ *ch = mons_char(object.mons);
}
if (colour)
@@ -575,41 +569,19 @@ unsigned grid_character_at(const coord_def &c)
return glych;
}
-void get_item_symbol(unsigned int object, unsigned *ch,
- unsigned short *colour)
-{
- if (object < NUM_FEATURES)
- {
- dungeon_feature_type feat = static_cast<dungeon_feature_type>(object);
- *ch = get_feature_def(feat).symbol;
-
- // Don't clobber with BLACK, because the colour should be already set.
- if (get_feature_def(feat).colour != BLACK)
- *colour = get_feature_def(feat).colour;
- }
- *colour = real_colour(*colour);
-
-}
-
-dungeon_char_type get_feature_dchar( dungeon_feature_type feat )
+dungeon_char_type get_feature_dchar(dungeon_feature_type feat)
{
return (get_feature_def(feat).dchar);
}
-unsigned get_sightmap_char(dungeon_feature_type feature)
+unsigned get_sightmap_char(dungeon_feature_type feat)
{
- if (feature < NUM_FEATURES)
- return (get_feature_def(feature).symbol);
-
- return (0);
+ return (get_feature_def(feat).symbol);
}
-unsigned get_magicmap_char(dungeon_feature_type feature)
+unsigned get_magicmap_char(dungeon_feature_type feat)
{
- if (feature < NUM_FEATURES)
- return (get_feature_def(feature).magic_symbol);
-
- return (0);
+ return (get_feature_def(feat).magic_symbol);
}
static char _get_travel_colour( const coord_def& p )
@@ -721,9 +693,9 @@ screen_buffer_t colour_code_map(const coord_def& p, bool item_colour,
dungeon_feature_type feat_value = grd(p);
if (!see_cell(p))
{
- const int remembered = get_envmap_obj(p);
- if (remembered < NUM_REAL_FEATURES)
- feat_value = static_cast<dungeon_feature_type>(remembered);
+ const show_type remembered = get_envmap_obj(p);
+ if (remembered.cls == SH_FEATURE)
+ feat_value = remembered.feat;
}
unsigned tc = travel_colour ? _get_travel_colour(p) : DARKGREY;
@@ -770,7 +742,7 @@ screen_buffer_t colour_code_map(const coord_def& p, bool item_colour,
const int olddist = grid_distance(you.pos(), mon.pos());
const int newdist = grid_distance(p, mon.pos());
- if (olddist < newdist || !see_cell(env.show, p, mon.pos()))
+ if (olddist < newdist || !see_cell(env.show_los, p, mon.pos()))
{
blocked_movement = true;
break;
@@ -847,19 +819,19 @@ void clear_map(bool clear_detected_items, bool clear_detected_monsters)
continue;
#endif
- set_envmap_obj(p, is_terrain_seen(p) || is_terrain_mapped(p)
- ? grd(p) : DNGN_UNSEEN);
+ set_envmap_obj(p, show_type(is_terrain_seen(p) || is_terrain_mapped(p)
+ ? grd(p) : DNGN_UNSEEN));
set_envmap_detected_mons(p, false);
set_envmap_detected_item(p, false);
#ifdef USE_TILE
if (is_terrain_mapped(p))
{
- unsigned int feature = grd(p);
+ dungeon_feature_type feature = grd(p);
unsigned int feat_symbol;
unsigned short feat_colour;
- get_item_symbol(feature, &feat_symbol, &feat_colour);
+ get_show_symbol(show_type(feature), &feat_symbol, &feat_colour);
unsigned int fg;
unsigned int bg;
@@ -1329,58 +1301,6 @@ void force_monster_shout(monsters* monster)
}
#endif
-inline static bool _update_monster_grid(const monsters *monster)
-{
- const coord_def e = grid2show(monster->pos());
-
- if (!monster->visible_to(&you))
- {
- // ripple effect?
- if (grd(monster->pos()) == DNGN_SHALLOW_WATER
- && !mons_flies(monster)
- && env.cgrid(monster->pos()) == EMPTY_CLOUD)
- {
- _set_show_backup(e.x, e.y);
- env.show(e) = DNGN_INVIS_EXPOSED;
-
- // Translates between colours used for shallow and deep water,
- // if not using the normal LIGHTCYAN / BLUE. The ripple uses
- // the deep water colour.
- unsigned short base_colour = env.grid_colours(monster->pos());
-
- static const unsigned short ripple_table[] =
- {BLUE, // BLACK => BLUE (default)
- BLUE, // BLUE => BLUE
- GREEN, // GREEN => GREEN
- CYAN, // CYAN => CYAN
- RED, // RED => RED
- MAGENTA, // MAGENTA => MAGENTA
- BROWN, // BROWN => BROWN
- DARKGREY, // LIGHTGREY => DARKGREY
- DARKGREY, // DARKGREY => DARKGREY
- BLUE, // LIGHTBLUE => BLUE
- GREEN, // LIGHTGREEN => GREEN
- BLUE, // LIGHTCYAN => BLUE
- RED, // LIGHTRED => RED
- MAGENTA, // LIGHTMAGENTA => MAGENTA
- BROWN, // YELLOW => BROWN
- LIGHTGREY}; // WHITE => LIGHTGREY
-
- env.show_col(e) = ripple_table[base_colour & 0x0f];
- }
- return (false);
- }
-
- // Mimics are always left on map.
- if (!mons_is_mimic( monster->type ))
- _set_show_backup(e.x, e.y);
-
- env.show(e) = monster->type + DNGN_START_OF_MONSTERS;
- env.show_col(e) = get_mons_colour( monster );
-
- return (true);
-}
-
void monster_grid(bool do_updates)
{
do_updates = do_updates && !crawl_state.arena;
@@ -1415,7 +1335,7 @@ void monster_grid(bool do_updates)
mgrd(monster->pos()) = s;
}
- if (!_update_monster_grid(monster))
+ if (!env.show.update_monster(monster))
continue;
#ifdef USE_TILE
@@ -1558,197 +1478,18 @@ bool check_awaken(monsters* monster)
return (false);
}
-static void _set_show_backup( int ex, int ey )
-{
- // Must avoid double setting it.
- // We want the base terrain/item, not the cloud or monster that replaced it.
- if (!Show_Backup[ex][ey])
- Show_Backup[ex][ey] = env.show[ex][ey];
-}
-
-static int _get_item_dngn_code(const item_def &item)
-{
- switch (item.base_type)
- {
- case OBJ_ORBS: return (DNGN_ITEM_ORB);
- case OBJ_WEAPONS: return (DNGN_ITEM_WEAPON);
- case OBJ_MISSILES: return (DNGN_ITEM_MISSILE);
- case OBJ_ARMOUR: return (DNGN_ITEM_ARMOUR);
- case OBJ_WANDS: return (DNGN_ITEM_WAND);
- case OBJ_FOOD: return (DNGN_ITEM_FOOD);
- case OBJ_SCROLLS: return (DNGN_ITEM_SCROLL);
- case OBJ_JEWELLERY:
- return (jewellery_is_amulet(item)? DNGN_ITEM_AMULET : DNGN_ITEM_RING);
- case OBJ_POTIONS: return (DNGN_ITEM_POTION);
- case OBJ_BOOKS: return (DNGN_ITEM_BOOK);
- case OBJ_STAVES: return (DNGN_ITEM_STAVE);
- case OBJ_MISCELLANY: return (DNGN_ITEM_MISCELLANY);
- case OBJ_CORPSES: return (DNGN_ITEM_CORPSE);
- case OBJ_GOLD: return (DNGN_ITEM_GOLD);
- default: return (DNGN_ITEM_ORB); // bad item character
- }
-}
-
-inline static void _update_item_grid(const coord_def &gp, const coord_def &ep)
-{
- const item_def &eitem = mitm[igrd(gp)];
- unsigned short &ecol = env.show_col(ep);
-
- const dungeon_feature_type feat = grd(gp);
- if (Options.feature_item_brand && is_critical_feature(feat))
- ecol |= COLFLAG_FEATURE_ITEM;
- else if (Options.trap_item_brand && feat_is_trap(feat))
- ecol |= COLFLAG_TRAP_ITEM;
- else
- {
- const unsigned short gcol = env.grid_colours(gp);
- ecol = (feat == DNGN_SHALLOW_WATER) ?
- (gcol != BLACK ? gcol : CYAN) : eitem.colour;
- if (eitem.link != NON_ITEM && !crawl_state.arena)
- ecol |= COLFLAG_ITEM_HEAP;
- env.show(ep) = _get_item_dngn_code( eitem );
- }
-
-#ifdef USE_TILE
- int idx = igrd(gp);
- if (feat_is_stair(feat))
- tile_place_item_marker(ep.x, ep.y, idx);
- else
- tile_place_item(ep.x, ep.y, idx);
-#endif
-}
-
-void item_grid()
-{
- const coord_def c(crawl_view.glosc());
- const coord_def offset(ENV_SHOW_OFFSET, ENV_SHOW_OFFSET);
- for (radius_iterator ri(c, LOS_RADIUS, true, false); ri; ++ri)
- {
- if (igrd(*ri) != NON_ITEM)
- {
- const coord_def ep = *ri - c + offset;
- if (env.show(ep))
- _update_item_grid(*ri, ep);
- }
- }
-}
-
-void get_item_glyph( const item_def *item, unsigned *glych,
- unsigned short *glycol )
+void get_item_glyph(const item_def *item, unsigned *glych,
+ unsigned short *glycol)
{
*glycol = item->colour;
- _get_symbol( coord_def(0,0), _get_item_dngn_code( *item ), glych, glycol );
-}
-
-void get_mons_glyph( const monsters *mons, unsigned *glych,
- unsigned short *glycol )
-{
- *glycol = get_mons_colour( mons );
- _get_symbol( coord_def(0,0), mons->type + DNGN_START_OF_MONSTERS,
- glych, glycol );
-}
-
-inline static void _update_cloud_grid(int cloudno)
-{
- int which_colour = LIGHTGREY;
- const coord_def e = grid2show(env.cloud[cloudno].pos);
-
- switch (env.cloud[cloudno].type)
- {
- case CLOUD_FIRE:
- case CLOUD_FOREST_FIRE:
- if (env.cloud[cloudno].decay <= 20)
- which_colour = RED;
- else if (env.cloud[cloudno].decay <= 40)
- which_colour = LIGHTRED;
- else if (one_chance_in(4))
- which_colour = RED;
- else if (one_chance_in(4))
- which_colour = LIGHTRED;
- else
- which_colour = YELLOW;
- break;
-
- case CLOUD_STINK:
- which_colour = GREEN;
- break;
-
- case CLOUD_COLD:
- if (env.cloud[cloudno].decay <= 20)
- which_colour = BLUE;
- else if (env.cloud[cloudno].decay <= 40)
- which_colour = LIGHTBLUE;
- else if (one_chance_in(4))
- which_colour = BLUE;
- else if (one_chance_in(4))
- which_colour = LIGHTBLUE;
- else
- which_colour = WHITE;
- break;
-
- case CLOUD_POISON:
- which_colour = (one_chance_in(3) ? LIGHTGREEN : GREEN);
- break;
-
- case CLOUD_BLUE_SMOKE:
- which_colour = LIGHTBLUE;
- break;
-
- case CLOUD_PURP_SMOKE:
- which_colour = MAGENTA;
- break;
-
- case CLOUD_MIASMA:
- case CLOUD_BLACK_SMOKE:
- which_colour = DARKGREY;
- break;
-
- case CLOUD_RAIN:
- case CLOUD_MIST:
- which_colour = ETC_MIST;
- break;
-
- case CLOUD_CHAOS:
- which_colour = ETC_RANDOM;
- break;
-
- case CLOUD_MUTAGENIC:
- which_colour = ETC_MUTAGENIC;
- break;
-
- default:
- which_colour = LIGHTGREY;
- break;
- }
-
- _set_show_backup(e.x, e.y);
- env.show(e) = DNGN_CLOUD;
- env.show_col(e) = which_colour;
-
-#ifdef USE_TILE
- tile_place_cloud(e.x, e.y, env.cloud[cloudno].type,
- env.cloud[cloudno].decay);
-#endif
+ _get_symbol(coord_def(0,0), show_type(*item), glych, glycol);
}
-void cloud_grid(void)
+void get_mons_glyph(const monsters *mons, unsigned *glych,
+ unsigned short *glycol)
{
- int mnc = 0;
-
- for (int s = 0; s < MAX_CLOUDS; s++)
- {
- // can anyone explain this??? {dlb}
- // its an optimization to avoid looking past the last cloud -bwr
- if (mnc >= env.cloud_no)
- break;
-
- if (env.cloud[s].type != CLOUD_NONE)
- {
- mnc++;
- if (see_cell(env.cloud[s].pos))
- _update_cloud_grid(s);
- }
- }
+ *glycol = get_mons_colour(mons);
+ _get_symbol(coord_def(0,0), show_type(mons), glych, glycol);
}
// Noisy now has a messenging service for giving messages to the
@@ -3391,18 +3132,18 @@ unsigned get_screen_glyph( int x, int y )
return get_screen_glyph(coord_def(x,y));
}
-unsigned get_screen_glyph( const coord_def& p )
+unsigned get_screen_glyph(const coord_def& p)
{
const coord_def ep = view2show(grid2view(p));
- int object = show_appearance(ep);
- unsigned short colour = env.show_col(ep);
+ show_type object = env.show(ep);
+ unsigned short colour = object.colour;
unsigned ch;
if (!object)
return get_envmap_char(p.x, p.y);
- _get_symbol( p, object, &ch, &colour );
+ _get_symbol(p, object, &ch, &colour);
return (ch);
}
@@ -3436,7 +3177,7 @@ std::string screenshot(bool fullscreen)
char_table_bk = Options.char_table;
init_char_table(CSET_ASCII);
- init_feature_table();
+ init_show_table();
int firstnonspace = -1;
int firstpopline = -1;
@@ -3461,7 +3202,7 @@ std::string screenshot(bool fullscreen)
if (ch && !isprint(ch))
{
// [ds] Evil hack time again. Peek at grid, use that character.
- int object = grid_appearance(gc);
+ show_type object = show_type(grid_appearance(gc));
unsigned glych;
unsigned short glycol = 0;
@@ -3494,7 +3235,7 @@ std::string screenshot(bool fullscreen)
// Restore char and feature tables.
Options.char_table = char_table_bk;
- init_feature_table();
+ init_show_table();
std::ostringstream ss;
if (firstpopline != -1 && lastpopline != -1)
@@ -3524,27 +3265,6 @@ static int _viewmap_flash_colour()
return (BLACK);
}
-static void _update_env_show(const coord_def &gp, const coord_def &ep)
-{
- // The sequence is grid, items, clouds, monsters.
- env.show(ep) = grd(gp);
- env.show_col(ep) = 0;
-
- if (igrd(gp) != NON_ITEM)
- _update_item_grid(gp, ep);
-
- const int cloud = env.cgrid(gp);
- if (cloud != EMPTY_CLOUD && env.cloud[cloud].type != CLOUD_NONE
- && env.cloud[cloud].pos == gp)
- {
- _update_cloud_grid(cloud);
- }
-
- const monsters *mons = monster_at(gp);
- if (mons && mons->alive())
- _update_monster_grid(mons);
-}
-
// Updates one square of the view area. Should only be called for square
// in LOS.
void view_update_at(const coord_def &pos)
@@ -3554,14 +3274,14 @@ void view_update_at(const coord_def &pos)
const coord_def vp = grid2view(pos);
const coord_def ep = view2show(vp);
- _update_env_show(pos, ep);
+ env.show.update_at(pos, ep);
- int object = show_appearance(ep);
+ show_type object = env.show(ep);
if (!object)
return;
- unsigned short colour = env.show_col(ep);
+ unsigned short colour = object.colour;
unsigned ch = 0;
_get_symbol( pos, object, &ch, &colour );
@@ -3680,12 +3400,9 @@ void viewwindow(bool draw_it, bool do_updates)
mcache.clear_nonref();
#endif
- env.show_col.init(LIGHTGREY);
- Show_Backup.init(0);
+ env.show.init();
- item_grid(); // Must be done before cloud and monster.
- cloud_grid();
- monster_grid( do_updates );
+ monster_grid(true);
#ifdef USE_TILE
tile_draw_rays(true);
@@ -3769,8 +3486,8 @@ void viewwindow(bool draw_it, bool do_updates)
else if (gc == you.pos() && !crawl_state.arena
&& !crawl_state.arena_suspended)
{
- int object = env.show(ep);
- unsigned short colour = env.show_col(ep);
+ show_type object = env.show(ep);
+ unsigned short colour = object.colour;
unsigned ch;
_get_symbol(gc, object, &ch, &colour);
@@ -3810,8 +3527,8 @@ void viewwindow(bool draw_it, bool do_updates)
}
else
{
- int object = show_appearance(ep);
- unsigned short colour = env.show_col(ep);
+ show_type object = env.show(ep);
+ unsigned short colour = object.colour;
unsigned ch;
_get_symbol( gc, object, &ch, &colour );
@@ -3868,11 +3585,11 @@ void viewwindow(bool draw_it, bool do_updates)
// to the grid before monsters and clouds were
// added otherwise.
if (Options.clean_map
- && Show_Backup(ep)
+ && env.show.get_backup(ep)
&& is_terrain_seen(gc))
{
- _get_symbol(gc, Show_Backup(ep), &ch, &colour);
- set_envmap_glyph(gc, Show_Backup(ep), colour);
+ _get_symbol(gc, env.show.get_backup(ep), &ch, &colour);
+ set_envmap_glyph(gc, env.show.get_backup(ep), colour);
}
// Now we get to filling in both the unseen
diff --git a/crawl-ref/source/view.h b/crawl-ref/source/view.h
index 88b2958a79..978fcad050 100644
--- a/crawl-ref/source/view.h
+++ b/crawl-ref/source/view.h
@@ -9,6 +9,7 @@
#define VIEW_H
#include "externs.h"
+#include "show.h"
void init_char_table(char_set_type set);
void init_monsters_seens();
@@ -49,22 +50,19 @@ unsigned get_screen_glyph( const coord_def &p );
std::string stringize_glyph(unsigned glyph);
int multibyte_strlen(const std::string &s);
-void get_item_symbol(unsigned int object, unsigned *ch,
- unsigned short *colour);
-
// Applies ETC_ colour substitutions and brands.
unsigned real_colour(unsigned raw_colour);
int get_mons_colour(const monsters *mons);
-void set_envmap_obj( const coord_def& where, int object );
+void set_envmap_obj(const coord_def& where, show_type object);
unsigned get_envmap_char(int x, int y);
inline unsigned get_envmap_char(const coord_def& c) {
return get_envmap_char(c.x, c.y);
}
bool inside_level_bounds(int x, int y);
bool inside_level_bounds(const coord_def &p);
-int get_envmap_obj(int x, int y);
-inline int get_envmap_obj(const coord_def& c) {
+show_type get_envmap_obj(int x, int y);
+inline show_type get_envmap_obj(const coord_def& c) {
return get_envmap_obj(c.x, c.y);
}
void set_envmap_detected_item(int x, int y, bool detected = true);
diff --git a/crawl-ref/source/xom.cc b/crawl-ref/source/xom.cc
index 9fd5def20c..e20073681f 100644
--- a/crawl-ref/source/xom.cc
+++ b/crawl-ref/source/xom.cc
@@ -2291,7 +2291,7 @@ static item_def* _tran_get_eq(equipment_type eq)
}
// Which types of dungeon features are in view?
-static void _get_in_view(FixedVector<bool, NUM_REAL_FEATURES>& in_view)
+static void _get_in_view(FixedVector<bool, NUM_FEATURES>& in_view)
{
in_view.init(false);
@@ -2321,7 +2321,7 @@ static void _xom_zero_miscast()
///////////////////////////////////
// Dungeon feature dependent stuff.
- FixedVector<bool, NUM_REAL_FEATURES> in_view;
+ FixedVector<bool, NUM_FEATURES> in_view;
_get_in_view(in_view);
if (in_view[DNGN_LAVA])