diff options
-rw-r--r-- | crawl-ref/source/externs.h | 22 | ||||
-rw-r--r-- | crawl-ref/source/feature.cc | 749 | ||||
-rw-r--r-- | crawl-ref/source/feature.h | 30 | ||||
-rw-r--r-- | crawl-ref/source/makefile.obj | 1 | ||||
-rw-r--r-- | crawl-ref/source/overmap.cc | 1 | ||||
-rw-r--r-- | crawl-ref/source/view.cc | 770 | ||||
-rw-r--r-- | crawl-ref/source/view.h | 3 | ||||
-rw-r--r-- | crawl-ref/source/xom.cc | 1 |
8 files changed, 797 insertions, 780 deletions
diff --git a/crawl-ref/source/externs.h b/crawl-ref/source/externs.h index 0c7bc73119..c064975b82 100644 --- a/crawl-ref/source/externs.h +++ b/crawl-ref/source/externs.h @@ -688,28 +688,6 @@ struct message_colour_mapping int colour; }; -struct feature_def -{ - dungeon_char_type dchar; - unsigned symbol; // symbol used for seen terrain - unsigned magic_symbol; // symbol used for magic-mapped terrain - unsigned short colour; // normal in LoS colour - unsigned short map_colour; // colour when out of LoS on display - unsigned short seen_colour; // map_colour when is_terrain_seen() - unsigned short em_colour; // Emphasised colour when in LoS. - unsigned short seen_em_colour; // Emphasised colour when out of LoS - unsigned flags; - map_feature minimap; // mini-map categorization - - bool is_notable() const { return (flags & FFT_NOTABLE); } -}; - -struct feature_override -{ - dungeon_feature_type feat; - feature_def override; -}; - class InvEntry; typedef int (*item_sort_fn)(const InvEntry *a, const InvEntry *b); struct item_comparator diff --git a/crawl-ref/source/feature.cc b/crawl-ref/source/feature.cc new file mode 100644 index 0000000000..85eab18c94 --- /dev/null +++ b/crawl-ref/source/feature.cc @@ -0,0 +1,749 @@ +#include "AppHdr.h" + +#include "feature.h" + +#include "colour.h" +#include "fixvec.h" +#include "options.h" + +static FixedVector<feature_def, NUM_FEATURES> Feature; + +const feature_def &get_feature_def(dungeon_feature_type feat) +{ + return (Feature[feat]); +} + +void apply_feature_overrides() +{ + for (int i = 0, size = Options.feature_overrides.size(); i < size; ++i) + { + const feature_override &fov = Options.feature_overrides[i]; + const feature_def &ofeat = fov.override; + feature_def &feat = Feature[fov.feat]; + + if (ofeat.symbol) + feat.symbol = ofeat.symbol; + if (ofeat.magic_symbol) + feat.magic_symbol = ofeat.magic_symbol; + if (ofeat.colour) + feat.colour = ofeat.colour; + if (ofeat.map_colour) + feat.map_colour = ofeat.map_colour; + if (ofeat.seen_colour) + feat.seen_colour = ofeat.seen_colour; + if (ofeat.seen_em_colour) + feat.seen_em_colour = ofeat.seen_em_colour; + if (ofeat.em_colour) + feat.em_colour = ofeat.em_colour; + } +} + +void init_feature_table(void) +{ + for (int i = 0; i < NUM_FEATURES; i++) + { + 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; + 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; + 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; + 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; + break; + + case DNGN_OPEN_SEA: +#ifdef USE_TILE + Feature[i].dchar = DCHAR_WAVY; +#else + Feature[i].dchar = DCHAR_WALL; +#endif + Feature[i].colour = BLUE; + Feature[i].minimap = MF_WATER; + break; + + case DNGN_OPEN_DOOR: + Feature[i].dchar = DCHAR_DOOR_OPEN; + Feature[i].colour = LIGHTGREY; + Feature[i].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; + 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; + 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; + 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; + 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; + 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; + break; + + case DNGN_GRANITE_STATUE: + Feature[i].dchar = DCHAR_STATUE; + Feature[i].colour = DARKGREY; + Feature[i].minimap = MF_WALL; + break; + + case DNGN_LAVA: + Feature[i].dchar = DCHAR_WAVY; + Feature[i].colour = RED; + Feature[i].minimap = MF_LAVA; + break; + + case DNGN_DEEP_WATER: + Feature[i].dchar = DCHAR_WAVY; + Feature[i].colour = BLUE; + Feature[i].minimap = MF_WATER; + break; + + case DNGN_SHALLOW_WATER: + Feature[i].dchar = DCHAR_WAVY; + Feature[i].colour = CYAN; + Feature[i].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; + 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; + 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; + 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; + break; + + case DNGN_TRAP_MECHANICAL: + Feature[i].colour = LIGHTCYAN; + Feature[i].dchar = DCHAR_TRAP; + Feature[i].map_colour = LIGHTCYAN; + Feature[i].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; + break; + + case DNGN_TRAP_NATURAL: + Feature[i].colour = BROWN; + Feature[i].dchar = DCHAR_TRAP; + Feature[i].map_colour = BROWN; + Feature[i].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; + 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; + break; + + case DNGN_ABANDONED_SHOP: + Feature[i].colour = LIGHTGREY; + Feature[i].dchar = DCHAR_ARCH; + Feature[i].map_colour = LIGHTGREY; + Feature[i].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; + break; + + case DNGN_ENTER_PORTAL_VAULT: + Feature[i].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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + break; + + case DNGN_STONE_ARCH: + Feature[i].colour = LIGHTGREY; + Feature[i].dchar = DCHAR_ARCH; + Feature[i].map_colour = LIGHTGREY; + Feature[i].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; + 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; + 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; + break; + + case DNGN_ENTER_ORCISH_MINES: + case DNGN_ENTER_HIVE: + case DNGN_ENTER_LAIR: + case DNGN_ENTER_SLIME_PITS: + case DNGN_ENTER_VAULTS: + case DNGN_ENTER_CRYPT: + case DNGN_ENTER_HALL_OF_BLADES: + case DNGN_ENTER_TEMPLE: + case DNGN_ENTER_SNAKE_PIT: + case DNGN_ENTER_ELVEN_HALLS: + 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; + 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; + break; + + case DNGN_RETURN_FROM_ORCISH_MINES: + case DNGN_RETURN_FROM_HIVE: + case DNGN_RETURN_FROM_LAIR: + case DNGN_RETURN_FROM_SLIME_PITS: + case DNGN_RETURN_FROM_VAULTS: + case DNGN_RETURN_FROM_CRYPT: + case DNGN_RETURN_FROM_HALL_OF_BLADES: + case DNGN_RETURN_FROM_TEMPLE: + case DNGN_RETURN_FROM_SNAKE_PIT: + case DNGN_RETURN_FROM_ELVEN_HALLS: + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + break; + + case DNGN_FOUNTAIN_BLUE: + Feature[i].colour = BLUE; + Feature[i].dchar = DCHAR_FOUNTAIN; + Feature[i].minimap = MF_FEATURE; + break; + + case DNGN_FOUNTAIN_SPARKLING: + Feature[i].colour = LIGHTBLUE; + Feature[i].dchar = DCHAR_FOUNTAIN; + Feature[i].minimap = MF_FEATURE; + break; + + case DNGN_FOUNTAIN_BLOOD: + Feature[i].colour = RED; + Feature[i].dchar = DCHAR_FOUNTAIN; + Feature[i].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; + break; + + case DNGN_INVIS_EXPOSED: + Feature[i].dchar = DCHAR_INVIS_EXPOSED; + Feature[i].minimap = MF_MONS_HOSTILE; + break; + + case DNGN_ITEM_DETECTED: + Feature[i].dchar = DCHAR_ITEM_DETECTED; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_ITEM_ORB: + Feature[i].dchar = DCHAR_ITEM_ORB; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_ITEM_WEAPON: + Feature[i].dchar = DCHAR_ITEM_WEAPON; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_ITEM_ARMOUR: + Feature[i].dchar = DCHAR_ITEM_ARMOUR; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_ITEM_WAND: + Feature[i].dchar = DCHAR_ITEM_WAND; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_ITEM_FOOD: + Feature[i].dchar = DCHAR_ITEM_FOOD; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_ITEM_SCROLL: + Feature[i].dchar = DCHAR_ITEM_SCROLL; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_ITEM_RING: + Feature[i].dchar = DCHAR_ITEM_RING; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_ITEM_POTION: + Feature[i].dchar = DCHAR_ITEM_POTION; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_ITEM_MISSILE: + Feature[i].dchar = DCHAR_ITEM_MISSILE; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_ITEM_BOOK: + Feature[i].dchar = DCHAR_ITEM_BOOK; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_ITEM_STAVE: + Feature[i].dchar = DCHAR_ITEM_STAVE; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_ITEM_MISCELLANY: + Feature[i].dchar = DCHAR_ITEM_MISCELLANY; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_ITEM_CORPSE: + Feature[i].dchar = DCHAR_ITEM_CORPSE; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_ITEM_GOLD: + Feature[i].dchar = DCHAR_ITEM_GOLD; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_ITEM_AMULET: + Feature[i].dchar = DCHAR_ITEM_AMULET; + Feature[i].minimap = MF_ITEM; + break; + + case DNGN_CLOUD: + Feature[i].dchar = DCHAR_CLOUD; + Feature[i].minimap = MF_SKIP; + break; + } + + if (i == DNGN_ENTER_ORCISH_MINES || i == DNGN_ENTER_SLIME_PITS + || i == DNGN_ENTER_LABYRINTH) + { + Feature[i].flags |= FFT_EXAMINE_HINT; + } + + if (Feature[i].dchar != NUM_DCHAR_TYPES) + Feature[i].symbol = Options.char_table[ Feature[i].dchar ]; + } + + apply_feature_overrides(); + + for (int i = 0; i < NUM_FEATURES; ++i) + { + feature_def &f(Feature[i]); + + if (!f.magic_symbol) + f.magic_symbol = f.symbol; + + if (f.seen_colour == BLACK) + f.seen_colour = f.map_colour; + + if (f.seen_em_colour == BLACK) + f.seen_em_colour = f.seen_colour; + + if (f.em_colour == BLACK) + f.em_colour = f.colour; + } +} diff --git a/crawl-ref/source/feature.h b/crawl-ref/source/feature.h new file mode 100644 index 0000000000..f9a7115693 --- /dev/null +++ b/crawl-ref/source/feature.h @@ -0,0 +1,30 @@ +#ifndef FEATURE_H +#define FEATURE_H + +struct feature_def +{ + dungeon_char_type dchar; + unsigned symbol; // symbol used for seen terrain + unsigned magic_symbol; // symbol used for magic-mapped terrain + unsigned short colour; // normal in LoS colour + unsigned short map_colour; // colour when out of LoS on display + unsigned short seen_colour; // map_colour when is_terrain_seen() + unsigned short em_colour; // Emphasised colour when in LoS. + unsigned short seen_em_colour; // Emphasised colour when out of LoS + unsigned flags; + map_feature minimap; // mini-map categorization + + bool is_notable() const { return (flags & FFT_NOTABLE); } +}; + +struct feature_override +{ + dungeon_feature_type feat; + feature_def override; +}; + +const feature_def &get_feature_def(dungeon_feature_type feat); + +void init_feature_table(); + +#endif diff --git a/crawl-ref/source/makefile.obj b/crawl-ref/source/makefile.obj index 183a392cd3..b47df8f2a3 100644 --- a/crawl-ref/source/makefile.obj +++ b/crawl-ref/source/makefile.obj @@ -29,6 +29,7 @@ dlua.o \ dungeon.o \ effects.o \ exclude.o \ +feature.o \ fight.o \ files.o \ food.o \ diff --git a/crawl-ref/source/overmap.cc b/crawl-ref/source/overmap.cc index 523989d022..7c33da7f73 100644 --- a/crawl-ref/source/overmap.cc +++ b/crawl-ref/source/overmap.cc @@ -25,6 +25,7 @@ #include "dgnevent.h" #include "directn.h" #include "dungeon.h" +#include "feature.h" #include "files.h" #include "initfile.h" #include "menu.h" diff --git a/crawl-ref/source/view.cc b/crawl-ref/source/view.cc index 358db488bb..057591bbba 100644 --- a/crawl-ref/source/view.cc +++ b/crawl-ref/source/view.cc @@ -35,6 +35,7 @@ #include "directn.h" #include "dungeon.h" #include "exclude.h" +#include "feature.h" #include "files.h" #include "format.h" #include "ghost.h" @@ -86,8 +87,6 @@ #define MC_ITEM 0x01 #define MC_MONS 0x02 -static FixedVector<feature_def, NUM_FEATURES> Feature; - crawl_view_geometry crawl_view; FixedArray < unsigned int, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER > Show_Backup; @@ -110,11 +109,6 @@ 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); -const feature_def &get_feature_def(dungeon_feature_type feat) -{ - return (Feature[feat]); -} - unsigned map_cell::glyph() const { if (!object) @@ -349,7 +343,7 @@ void clear_envmap_grid( int x, int y ) bool is_notable_terrain(dungeon_feature_type ftype) { - return (Feature[ftype].is_notable()); + return (get_feature_def(ftype).is_notable()); } #if defined(TARGET_OS_WINDOWS) || defined(TARGET_OS_DOS) || defined(USE_TILE) @@ -466,7 +460,7 @@ static void _get_symbol( const coord_def& where, { const dungeon_feature_type feat = static_cast<dungeon_feature_type>(object); - const feature_def &fdef = Feature[object]; + const feature_def &fdef = get_feature_def(feat); *ch = magic_mapped? fdef.magic_symbol : fdef.symbol; @@ -586,11 +580,12 @@ void get_item_symbol(unsigned int object, unsigned *ch, { if (object < NUM_FEATURES) { - *ch = Feature[object].symbol; + 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 (Feature[object].colour != BLACK) - *colour = Feature[object].colour; + if (get_feature_def(feat).colour != BLACK) + *colour = get_feature_def(feat).colour; } *colour = real_colour(*colour); @@ -598,21 +593,21 @@ void get_item_symbol(unsigned int object, unsigned *ch, dungeon_char_type get_feature_dchar( dungeon_feature_type feat ) { - return (Feature[feat].dchar); + return (get_feature_def(feat).dchar); } -unsigned get_sightmap_char( int feature ) +unsigned get_sightmap_char(dungeon_feature_type feature) { if (feature < NUM_FEATURES) - return (Feature[feature].symbol); + return (get_feature_def(feature).symbol); return (0); } -unsigned get_magicmap_char( int feature ) +unsigned get_magicmap_char(dungeon_feature_type feature) { if (feature < NUM_FEATURES) - return (Feature[feature].magic_symbol); + return (get_feature_def(feature).magic_symbol); return (0); } @@ -752,7 +747,7 @@ screen_buffer_t colour_code_map(const coord_def& p, bool item_colour, int feature_colour = DARKGREY; const bool terrain_seen = is_terrain_seen(p); - const feature_def &fdef = Feature[feat_value]; + const feature_def &fdef = get_feature_def(feat_value); feature_colour = terrain_seen ? fdef.seen_colour : fdef.map_colour; if (terrain_seen && fdef.seen_em_colour && _emphasise(p, feat_value)) @@ -3391,741 +3386,6 @@ unsigned dchar_glyph(dungeon_char_type dchar) return (Options.char_table[dchar]); } -void apply_feature_overrides() -{ - for (int i = 0, size = Options.feature_overrides.size(); i < size; ++i) - { - const feature_override &fov = Options.feature_overrides[i]; - const feature_def &ofeat = fov.override; - feature_def &feat = Feature[fov.feat]; - - if (ofeat.symbol) - feat.symbol = ofeat.symbol; - if (ofeat.magic_symbol) - feat.magic_symbol = ofeat.magic_symbol; - if (ofeat.colour) - feat.colour = ofeat.colour; - if (ofeat.map_colour) - feat.map_colour = ofeat.map_colour; - if (ofeat.seen_colour) - feat.seen_colour = ofeat.seen_colour; - if (ofeat.seen_em_colour) - feat.seen_em_colour = ofeat.seen_em_colour; - if (ofeat.em_colour) - feat.em_colour = ofeat.em_colour; - } -} - -void init_feature_table( void ) -{ - for (int i = 0; i < NUM_FEATURES; i++) - { - 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; - 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; - 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; - 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; - break; - - case DNGN_OPEN_SEA: -#ifdef USE_TILE - Feature[i].dchar = DCHAR_WAVY; -#else - Feature[i].dchar = DCHAR_WALL; -#endif - Feature[i].colour = BLUE; - Feature[i].minimap = MF_WATER; - break; - - case DNGN_OPEN_DOOR: - Feature[i].dchar = DCHAR_DOOR_OPEN; - Feature[i].colour = LIGHTGREY; - Feature[i].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; - 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; - 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; - 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; - 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; - 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; - break; - - case DNGN_GRANITE_STATUE: - Feature[i].dchar = DCHAR_STATUE; - Feature[i].colour = DARKGREY; - Feature[i].minimap = MF_WALL; - break; - - case DNGN_LAVA: - Feature[i].dchar = DCHAR_WAVY; - Feature[i].colour = RED; - Feature[i].minimap = MF_LAVA; - break; - - case DNGN_DEEP_WATER: - Feature[i].dchar = DCHAR_WAVY; - Feature[i].colour = BLUE; - Feature[i].minimap = MF_WATER; - break; - - case DNGN_SHALLOW_WATER: - Feature[i].dchar = DCHAR_WAVY; - Feature[i].colour = CYAN; - Feature[i].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; - 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; - 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; - 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; - break; - - case DNGN_TRAP_MECHANICAL: - Feature[i].colour = LIGHTCYAN; - Feature[i].dchar = DCHAR_TRAP; - Feature[i].map_colour = LIGHTCYAN; - Feature[i].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; - break; - - case DNGN_TRAP_NATURAL: - Feature[i].colour = BROWN; - Feature[i].dchar = DCHAR_TRAP; - Feature[i].map_colour = BROWN; - Feature[i].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; - 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; - break; - - case DNGN_ABANDONED_SHOP: - Feature[i].colour = LIGHTGREY; - Feature[i].dchar = DCHAR_ARCH; - Feature[i].map_colour = LIGHTGREY; - Feature[i].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; - break; - - case DNGN_ENTER_PORTAL_VAULT: - Feature[i].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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - break; - - case DNGN_STONE_ARCH: - Feature[i].colour = LIGHTGREY; - Feature[i].dchar = DCHAR_ARCH; - Feature[i].map_colour = LIGHTGREY; - Feature[i].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; - 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; - 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; - break; - - case DNGN_ENTER_ORCISH_MINES: - case DNGN_ENTER_HIVE: - case DNGN_ENTER_LAIR: - case DNGN_ENTER_SLIME_PITS: - case DNGN_ENTER_VAULTS: - case DNGN_ENTER_CRYPT: - case DNGN_ENTER_HALL_OF_BLADES: - case DNGN_ENTER_TEMPLE: - case DNGN_ENTER_SNAKE_PIT: - case DNGN_ENTER_ELVEN_HALLS: - 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; - 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; - break; - - case DNGN_RETURN_FROM_ORCISH_MINES: - case DNGN_RETURN_FROM_HIVE: - case DNGN_RETURN_FROM_LAIR: - case DNGN_RETURN_FROM_SLIME_PITS: - case DNGN_RETURN_FROM_VAULTS: - case DNGN_RETURN_FROM_CRYPT: - case DNGN_RETURN_FROM_HALL_OF_BLADES: - case DNGN_RETURN_FROM_TEMPLE: - case DNGN_RETURN_FROM_SNAKE_PIT: - case DNGN_RETURN_FROM_ELVEN_HALLS: - 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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - 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; - break; - - case DNGN_FOUNTAIN_BLUE: - Feature[i].colour = BLUE; - Feature[i].dchar = DCHAR_FOUNTAIN; - Feature[i].minimap = MF_FEATURE; - break; - - case DNGN_FOUNTAIN_SPARKLING: - Feature[i].colour = LIGHTBLUE; - Feature[i].dchar = DCHAR_FOUNTAIN; - Feature[i].minimap = MF_FEATURE; - break; - - case DNGN_FOUNTAIN_BLOOD: - Feature[i].colour = RED; - Feature[i].dchar = DCHAR_FOUNTAIN; - Feature[i].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; - break; - - case DNGN_INVIS_EXPOSED: - Feature[i].dchar = DCHAR_INVIS_EXPOSED; - Feature[i].minimap = MF_MONS_HOSTILE; - break; - - case DNGN_ITEM_DETECTED: - Feature[i].dchar = DCHAR_ITEM_DETECTED; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_ITEM_ORB: - Feature[i].dchar = DCHAR_ITEM_ORB; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_ITEM_WEAPON: - Feature[i].dchar = DCHAR_ITEM_WEAPON; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_ITEM_ARMOUR: - Feature[i].dchar = DCHAR_ITEM_ARMOUR; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_ITEM_WAND: - Feature[i].dchar = DCHAR_ITEM_WAND; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_ITEM_FOOD: - Feature[i].dchar = DCHAR_ITEM_FOOD; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_ITEM_SCROLL: - Feature[i].dchar = DCHAR_ITEM_SCROLL; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_ITEM_RING: - Feature[i].dchar = DCHAR_ITEM_RING; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_ITEM_POTION: - Feature[i].dchar = DCHAR_ITEM_POTION; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_ITEM_MISSILE: - Feature[i].dchar = DCHAR_ITEM_MISSILE; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_ITEM_BOOK: - Feature[i].dchar = DCHAR_ITEM_BOOK; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_ITEM_STAVE: - Feature[i].dchar = DCHAR_ITEM_STAVE; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_ITEM_MISCELLANY: - Feature[i].dchar = DCHAR_ITEM_MISCELLANY; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_ITEM_CORPSE: - Feature[i].dchar = DCHAR_ITEM_CORPSE; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_ITEM_GOLD: - Feature[i].dchar = DCHAR_ITEM_GOLD; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_ITEM_AMULET: - Feature[i].dchar = DCHAR_ITEM_AMULET; - Feature[i].minimap = MF_ITEM; - break; - - case DNGN_CLOUD: - Feature[i].dchar = DCHAR_CLOUD; - Feature[i].minimap = MF_SKIP; - break; - } - - if (i == DNGN_ENTER_ORCISH_MINES || i == DNGN_ENTER_SLIME_PITS - || i == DNGN_ENTER_LABYRINTH) - { - Feature[i].flags |= FFT_EXAMINE_HINT; - } - - if (Feature[i].dchar != NUM_DCHAR_TYPES) - Feature[i].symbol = Options.char_table[ Feature[i].dchar ]; - } - - apply_feature_overrides(); - - for (int i = 0; i < NUM_FEATURES; ++i) - { - feature_def &f(Feature[i]); - - if (!f.magic_symbol) - f.magic_symbol = f.symbol; - - if (f.seen_colour == BLACK) - f.seen_colour = f.map_colour; - - if (f.seen_em_colour == BLACK) - f.seen_em_colour = f.seen_colour; - - if (f.em_colour == BLACK) - f.em_colour = f.colour; - } -} - unsigned get_screen_glyph( int x, int y ) { return get_screen_glyph(coord_def(x,y)); @@ -4166,9 +3426,9 @@ int multibyte_strlen(const std::string &s) // is set to false, only the viewable area is returned. Leading and trailing // spaces are trimmed from each line. Leading and trailing empty lines are also // snipped. -std::string screenshot( bool fullscreen ) +std::string screenshot(bool fullscreen) { - UNUSED( fullscreen ); + UNUSED(fullscreen); // [ds] Screenshots need to be straight ASCII. We will now proceed to force // the char and feature tables back to ASCII. diff --git a/crawl-ref/source/view.h b/crawl-ref/source/view.h index c2815302a7..88b2958a79 100644 --- a/crawl-ref/source/view.h +++ b/crawl-ref/source/view.h @@ -11,7 +11,6 @@ #include "externs.h" void init_char_table(char_set_type set); -void init_feature_table(); void init_monsters_seens(); void beogh_follower_convert(monsters *monster, bool orc_hit = false); @@ -57,8 +56,6 @@ void get_item_symbol(unsigned int object, unsigned *ch, unsigned real_colour(unsigned raw_colour); int get_mons_colour(const monsters *mons); -const feature_def &get_feature_def(dungeon_feature_type feat); - void set_envmap_obj( const coord_def& where, int object ); unsigned get_envmap_char(int x, int y); inline unsigned get_envmap_char(const coord_def& c) { diff --git a/crawl-ref/source/xom.cc b/crawl-ref/source/xom.cc index 6cc4cc214e..17bd18b9f0 100644 --- a/crawl-ref/source/xom.cc +++ b/crawl-ref/source/xom.cc @@ -15,6 +15,7 @@ #include "delay.h" #include "directn.h" #include "effects.h" +#include "feature.h" #include "goditem.h" #include "it_use2.h" #include "items.h" |