diff options
Diffstat (limited to 'crawl-ref/source/feature.cc')
-rw-r--r-- | crawl-ref/source/feature.cc | 829 |
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; |