summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/feature.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/feature.cc')
-rw-r--r--crawl-ref/source/feature.cc829
1 files changed, 419 insertions, 410 deletions
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;