diff options
author | Shmuale Mark <shm.mark@gmail.com> | 2014-07-10 08:15:39 -0400 |
---|---|---|
committer | Shmuale Mark <shm.mark@gmail.com> | 2014-07-14 08:47:43 -0400 |
commit | fff14fb3beb1d2e70d702f1cda6a7de6355c2507 (patch) | |
tree | b18cefd32601dc87d815b1573a903537660375d5 | |
parent | dc4f2bac322bd5c5cb7073bd8a568aca169ceaf0 (diff) | |
download | crawl-ref-fff14fb3beb1d2e70d702f1cda6a7de6355c2507.tar.gz crawl-ref-fff14fb3beb1d2e70d702f1cda6a7de6355c2507.zip |
Separate feature data into feature-data.h.
-rw-r--r-- | crawl-ref/source/enum.h | 4 | ||||
-rw-r--r-- | crawl-ref/source/feature-data.h | 541 | ||||
-rw-r--r-- | crawl-ref/source/feature.cc | 540 | ||||
-rw-r--r-- | crawl-ref/source/feature.h | 36 | ||||
-rw-r--r-- | crawl-ref/source/initfile.cc | 1 |
5 files changed, 614 insertions, 508 deletions
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h index 1f1e67c37e..fd0b21d3ae 100644 --- a/crawl-ref/source/enum.h +++ b/crawl-ref/source/enum.h @@ -1311,8 +1311,8 @@ enum dungeon_char_type // When adding: // -// * New stairs/portals: update grid_stair_direction. -// * Any: edit view.cc and add a glyph and colour for the feature. +// * New stairs/portals: update feat_stair_direction. +// * Any: Add an entry in feature-data.h for the feature. // * Any: edit directn.cc and add a description for the feature. // * Any: edit dat/descript/features.txt and add a // long description if appropriate. diff --git a/crawl-ref/source/feature-data.h b/crawl-ref/source/feature-data.h new file mode 100644 index 0000000000..09ca4908cd --- /dev/null +++ b/crawl-ref/source/feature-data.h @@ -0,0 +1,541 @@ +// symbol and magic_symbol are generally constructed from dchar in +// _create_symbols(). They're necessary in feature_def mostly to make +// the `feature` option work better. + +// In the default case, these translations hold: +// map_colour -> seen_colour +// seen_colour -> seen_em_colour +// colour -> em_colour +// So use a macro: +#define COLOURS(colour, map) colour, map, map, colour, map +// And with the default (darkgrey) map colour: +#define COLOUR_IS(colour) COLOURS(colour, DARKGREY) +// And for when colour and map_colour are equal: +#define COLOUR_AND_MAP(colour) COLOURS(colour, colour) +static feature_def feat_defs[] = +{ + +{ + // feat + DNGN_UNSEEN, + // dchar, symbol, magic_symbol + NUM_DCHAR_TYPES, 0, 0, + // colour, map_colour, seen_colour, em_colour, seen_em_colour + BLACK, DARKGREY, DARKGREY, BLACK, DARKGREY, + // flags, minimap + FFT_NONE, MF_UNSEEN, +}, + +{ + DNGN_EXPLORE_HORIZON, + NUM_DCHAR_TYPES, 0, 0, + COLOUR_IS(BLACK), + FFT_NONE, MF_UNSEEN, +}, + +{ + DNGN_CLOSED_DOOR, + DCHAR_DOOR_CLOSED, 0, 0, + COLOUR_IS(LIGHTGREY), + FFT_NONE, MF_DOOR, +}, + +{ + DNGN_RUNED_DOOR, + DCHAR_DOOR_CLOSED, 0, 0, + COLOUR_AND_MAP(LIGHTBLUE), + FFT_NONE, MF_DOOR, +}, + +{ + DNGN_SEALED_DOOR, + DCHAR_DOOR_CLOSED, 0, 0, + COLOUR_AND_MAP(LIGHTGREEN), + FFT_NONE, MF_DOOR, +}, + +{ + DNGN_TREE, + DCHAR_TREE, 0, Options.char_table[ DCHAR_WALL_MAGIC ], + COLOUR_IS(ETC_TREE), + FFT_NONE, MF_WALL, +}, + +{ + DNGN_METAL_WALL, + DCHAR_WALL, 0, Options.char_table[ DCHAR_WALL_MAGIC ], + COLOUR_IS(CYAN), + FFT_NONE, MF_WALL, +}, + +{ + DNGN_GREEN_CRYSTAL_WALL, + DCHAR_WALL, 0, Options.char_table[ DCHAR_WALL_MAGIC ], + COLOUR_IS(GREEN), + FFT_NONE, MF_WALL, +}, + +{ + DNGN_ROCK_WALL, + DCHAR_WALL, 0, Options.char_table[ DCHAR_WALL_MAGIC ], + COLOUR_IS(ETC_ROCK), + FFT_NONE, MF_WALL, +}, + +{ + DNGN_SLIMY_WALL, + DCHAR_WALL, 0, Options.char_table[ DCHAR_WALL_MAGIC ], + COLOUR_IS(LIGHTGREEN), + FFT_NONE, MF_WALL, +}, + +{ + DNGN_STONE_WALL, + DCHAR_WALL, 0, Options.char_table[ DCHAR_WALL_MAGIC ], + COLOUR_IS(LIGHTGREY), + FFT_NONE, MF_WALL, +}, + +{ + DNGN_PERMAROCK_WALL, + DCHAR_PERMAWALL, 0, Options.char_table[ DCHAR_WALL_MAGIC ], + COLOUR_IS(ETC_ROCK), + FFT_NONE, MF_WALL, +}, + +{ + DNGN_CLEAR_ROCK_WALL, + DCHAR_WALL, 0, Options.char_table[ DCHAR_WALL_MAGIC ], + COLOUR_IS(LIGHTCYAN), + FFT_NONE, MF_WALL, +}, + +{ + DNGN_CLEAR_STONE_WALL, + DCHAR_WALL, 0, Options.char_table[ DCHAR_WALL_MAGIC ], + COLOUR_IS(LIGHTCYAN), + FFT_NONE, MF_WALL, +}, + +{ + DNGN_CLEAR_PERMAROCK_WALL, + DCHAR_PERMAWALL, 0, Options.char_table[ DCHAR_WALL_MAGIC ], + COLOUR_IS(LIGHTCYAN), + FFT_NONE, MF_WALL, +}, + +{ + DNGN_GRATE, + DCHAR_GRATE, 0, Options.char_table[ DCHAR_WALL_MAGIC ], + COLOUR_IS(LIGHTBLUE), + FFT_NONE, MF_WALL, +}, + +{ + DNGN_OPEN_SEA, + DCHAR_WALL, 0, 0, + COLOUR_IS(BLUE), + FFT_NONE, MF_DEEP_WATER, +}, + +{ + DNGN_LAVA_SEA, + DCHAR_WALL, 0, 0, + COLOUR_IS(RED), + FFT_NONE, MF_LAVA, +}, + +{ + DNGN_ORCISH_IDOL, + DCHAR_STATUE, 0, 0, + COLOUR_IS(BROWN), + FFT_NONE, MF_WALL, +}, + +{ + DNGN_GRANITE_STATUE, + DCHAR_STATUE, 0, 0, + COLOUR_IS(DARKGREY), + FFT_NONE, MF_WALL, +}, + +{ + DNGN_MALIGN_GATEWAY, + DCHAR_ARCH, 0, 0, + COLOURS(ETC_SHIMMER_BLUE, LIGHTGREY), + FFT_NONE, MF_STAIR_UP, +}, + +{ + DNGN_LAVA, + DCHAR_WAVY, 0, 0, + COLOUR_IS(RED), + FFT_NONE, MF_LAVA, +}, + +{ + DNGN_DEEP_WATER, + DCHAR_WAVY, 0, 0, + COLOUR_IS(BLUE), + FFT_NONE, MF_DEEP_WATER, +}, + +{ + DNGN_SHALLOW_WATER, + DCHAR_WAVY, 0, 0, + COLOUR_IS(CYAN), + FFT_NONE, MF_WATER, +}, + +{ + DNGN_FLOOR, + DCHAR_FLOOR, 0, Options.char_table[ DCHAR_FLOOR_MAGIC ], + COLOUR_IS(ETC_FLOOR), + FFT_NONE, MF_FLOOR, +}, + +#if TAG_MAJOR_VERSION == 34 +{ + DNGN_BADLY_SEALED_DOOR, + DCHAR_FLOOR, 0, Options.char_table[ DCHAR_FLOOR_MAGIC ], + COLOUR_IS(ETC_FLOOR), + FFT_NONE, MF_FLOOR, +}, +#endif + +{ + DNGN_EXPIRED_PORTAL, + DCHAR_FLOOR, 0, Options.char_table[ DCHAR_FLOOR_MAGIC ], + COLOUR_IS(BROWN), + FFT_NONE, MF_FLOOR, +}, + +{ + DNGN_OPEN_DOOR, + DCHAR_DOOR_OPEN, 0, 0, + COLOUR_IS(LIGHTGREY), + FFT_NONE, MF_DOOR, +}, + +#define TRAP(enum, colour)\ +{\ + enum,\ + DCHAR_TRAP, 0, 0,\ + COLOUR_AND_MAP(colour),\ + FFT_NONE, MF_TRAP,\ +} + +TRAP(DNGN_TRAP_MECHANICAL, LIGHTCYAN), +TRAP(DNGN_TRAP_TELEPORT, LIGHTBLUE), +TRAP(DNGN_TRAP_ALARM, LIGHTRED), +TRAP(DNGN_TRAP_ZOT, LIGHTMAGENTA), +TRAP(DNGN_PASSAGE_OF_GOLUBRIA, GREEN), +TRAP(DNGN_TRAP_SHAFT, BROWN), +TRAP(DNGN_TRAP_WEB, LIGHTGREY), + +{ + DNGN_UNDISCOVERED_TRAP, + DCHAR_FLOOR, 0, Options.char_table[ DCHAR_FLOOR_MAGIC ], + COLOUR_IS(ETC_FLOOR), + FFT_NONE, MF_FLOOR, +}, + +{ + DNGN_ENTER_SHOP, + DCHAR_ARCH, 0, 0, + YELLOW, LIGHTGREY, YELLOW, YELLOW, LIGHTGREY, + FFT_NOTABLE, MF_FEATURE, +}, + +{ + DNGN_ABANDONED_SHOP, + DCHAR_ARCH, 0, 0, + COLOUR_AND_MAP(LIGHTGREY), + FFT_NONE, MF_FLOOR, +}, + +{ + DNGN_STONE_ARCH, + DCHAR_ARCH, 0, 0, + COLOUR_AND_MAP(LIGHTGREY), + FFT_NONE, MF_FLOOR, +}, + +{ + DNGN_UNKNOWN_PORTAL, + DCHAR_ARCH, 0, 0, + COLOURS(BLACK, LIGHTGREY), + FFT_NONE, MF_PORTAL, +}, + +#define STONE_STAIRS_DOWN(num)\ +{\ + DNGN_STONE_STAIRS_DOWN_##num,\ + DCHAR_STAIRS_DOWN, 0, 0,\ + RED, RED, RED, WHITE, WHITE,\ + FFT_NONE, MF_STAIR_DOWN,\ +} + +STONE_STAIRS_DOWN(I), +STONE_STAIRS_DOWN(II), +STONE_STAIRS_DOWN(III), + +#define STONE_STAIRS_UP(num)\ +{\ + DNGN_STONE_STAIRS_UP_##num,\ + DCHAR_STAIRS_UP, 0, 0,\ + GREEN, GREEN, GREEN, WHITE, WHITE,\ + FFT_NONE, MF_STAIR_UP,\ +} + +STONE_STAIRS_UP(I), +STONE_STAIRS_UP(II), +STONE_STAIRS_UP(III), + +{ + DNGN_ESCAPE_HATCH_DOWN, + DCHAR_STAIRS_DOWN, 0, 0, + COLOUR_AND_MAP(BROWN), + FFT_NONE, MF_STAIR_DOWN, +}, + +{ + DNGN_ESCAPE_HATCH_UP, + DCHAR_STAIRS_UP, 0, 0, + COLOUR_AND_MAP(BROWN), + FFT_NONE, MF_STAIR_UP, +}, + +{ + DNGN_EXIT_LABYRINTH, + DCHAR_STAIRS_UP, 0, 0, + COLOUR_AND_MAP(BROWN), + FFT_NONE, MF_STAIR_UP, +}, + +{ + DNGN_ENTER_LABYRINTH, + DCHAR_ARCH, 0, 0, + ETC_SHIMMER_BLUE, LIGHTGREY, ETC_SHIMMER_BLUE, ETC_SHIMMER_BLUE, ETC_SHIMMER_BLUE, + (FFT_NOTABLE | FFT_EXAMINE_HINT), MF_PORTAL, +}, + +#define PORTAL_ENTRANCE(enum, colour)\ +{\ + enum,\ + DCHAR_ARCH, 0, 0,\ + colour, LIGHTGREY, colour, colour, colour,\ + FFT_NOTABLE, MF_PORTAL,\ +} + +#define PORTAL_EXIT(enum, colour)\ +{\ + enum,\ + DCHAR_ARCH, 0, 0,\ + colour, LIGHTGREY, colour, colour, colour,\ + FFT_NONE, MF_PORTAL,\ +} + +PORTAL_ENTRANCE(DNGN_ENTER_DIS, CYAN), +PORTAL_ENTRANCE(DNGN_ENTER_GEHENNA, RED), +PORTAL_ENTRANCE(DNGN_ENTER_COCYTUS, LIGHTCYAN), +PORTAL_ENTRANCE(DNGN_ENTER_TARTARUS, MAGENTA), +PORTAL_ENTRANCE(DNGN_ENTER_HELL, RED), +PORTAL_EXIT(DNGN_EXIT_HELL, LIGHTRED), + +PORTAL_ENTRANCE(DNGN_ENTER_ABYSS, ETC_WARP), +PORTAL_ENTRANCE(DNGN_EXIT_THROUGH_ABYSS, ETC_WARP), +PORTAL_EXIT(DNGN_EXIT_ABYSS, ETC_WARP), + +PORTAL_ENTRANCE(DNGN_ENTER_PANDEMONIUM, LIGHTBLUE), +PORTAL_EXIT(DNGN_TRANSIT_PANDEMONIUM, LIGHTGREEN), +PORTAL_EXIT(DNGN_EXIT_PANDEMONIUM, LIGHTBLUE), + +PORTAL_ENTRANCE(DNGN_ENTER_VAULTS, LIGHTGREEN), +PORTAL_EXIT(DNGN_RETURN_FROM_VAULTS, ETC_SHIMMER_BLUE), + +PORTAL_ENTRANCE(DNGN_ENTER_ZOT, MAGENTA), +PORTAL_EXIT(DNGN_RETURN_FROM_ZOT, MAGENTA), + +#if TAG_MAJOR_VERSION == 34 +PORTAL_ENTRANCE(DNGN_ENTER_PORTAL_VAULT, ETC_SHIMMER_BLUE), +#endif +PORTAL_ENTRANCE(DNGN_ENTER_ZIGGURAT, ETC_SHIMMER_BLUE), +PORTAL_ENTRANCE(DNGN_ENTER_BAZAAR, ETC_SHIMMER_BLUE), +PORTAL_ENTRANCE(DNGN_ENTER_TROVE, BLUE), +PORTAL_ENTRANCE(DNGN_ENTER_SEWER, LIGHTGREEN), +PORTAL_ENTRANCE(DNGN_ENTER_OSSUARY, BROWN), +PORTAL_ENTRANCE(DNGN_ENTER_BAILEY, LIGHTRED), +PORTAL_ENTRANCE(DNGN_ENTER_ICE_CAVE, WHITE), +PORTAL_ENTRANCE(DNGN_ENTER_VOLCANO, RED), +PORTAL_ENTRANCE(DNGN_ENTER_WIZLAB, ETC_SHIMMER_BLUE), +PORTAL_ENTRANCE(DNGN_UNUSED_ENTER_PORTAL_1, ETC_SHIMMER_BLUE), +#if TAG_MAJOR_VERSION == 34 +PORTAL_EXIT(DNGN_EXIT_PORTAL_VAULT, ETC_SHIMMER_BLUE), +#endif +PORTAL_EXIT(DNGN_EXIT_ZIGGURAT, ETC_SHIMMER_BLUE), +PORTAL_EXIT(DNGN_EXIT_BAZAAR, ETC_SHIMMER_BLUE), +PORTAL_EXIT(DNGN_EXIT_TROVE, BLUE), +PORTAL_EXIT(DNGN_EXIT_SEWER, BROWN), +PORTAL_EXIT(DNGN_EXIT_OSSUARY, BROWN), +PORTAL_EXIT(DNGN_EXIT_BAILEY, ETC_SHIMMER_BLUE), +PORTAL_EXIT(DNGN_EXIT_ICE_CAVE, WHITE), +PORTAL_EXIT(DNGN_EXIT_VOLCANO, RED), +PORTAL_EXIT(DNGN_EXIT_WIZLAB, ETC_SHIMMER_BLUE), +PORTAL_EXIT(DNGN_UNUSED_EXIT_PORTAL_1, ETC_SHIMMER_BLUE), + +#define BRANCH_ENTRANCE(enum)\ +{\ + enum,\ + DCHAR_STAIRS_DOWN, 0, 0,\ + YELLOW, RED, YELLOW, YELLOW, YELLOW,\ + FFT_NOTABLE, MF_STAIR_BRANCH,\ +} + +#define BRANCH_EXIT(enum)\ +{\ + enum,\ + DCHAR_STAIRS_UP, 0, 0,\ + YELLOW, GREEN, YELLOW, YELLOW, YELLOW,\ + FFT_NONE, MF_STAIR_UP,\ +} + +{ + DNGN_EXIT_DUNGEON, + DCHAR_STAIRS_UP, 0, 0, + LIGHTBLUE, GREEN, LIGHTBLUE, LIGHTBLUE, LIGHTBLUE, + FFT_NONE, MF_STAIR_UP, +}, + +{ + DNGN_ENTER_SLIME, + DCHAR_STAIRS_DOWN, 0, 0, + YELLOW, RED, YELLOW, YELLOW, YELLOW, + (FFT_NOTABLE | FFT_EXAMINE_HINT), MF_STAIR_BRANCH, +}, +BRANCH_EXIT(DNGN_RETURN_FROM_SLIME), + +{ + DNGN_ENTER_ORC, + DCHAR_STAIRS_DOWN, 0, 0, + YELLOW, RED, YELLOW, YELLOW, YELLOW, + (FFT_NOTABLE | FFT_EXAMINE_HINT), MF_STAIR_BRANCH, +}, +BRANCH_EXIT(DNGN_RETURN_FROM_ORC), + +#if TAG_MAJOR_VERSION == 34 +BRANCH_ENTRANCE(DNGN_ENTER_DWARF), +BRANCH_ENTRANCE(DNGN_ENTER_FOREST), +BRANCH_ENTRANCE(DNGN_ENTER_BLADE), +BRANCH_EXIT(DNGN_RETURN_FROM_DWARF), +BRANCH_EXIT(DNGN_RETURN_FROM_FOREST), +BRANCH_EXIT(DNGN_RETURN_FROM_BLADE), +#endif + +BRANCH_ENTRANCE(DNGN_ENTER_LAIR), +BRANCH_EXIT(DNGN_RETURN_FROM_LAIR), + +BRANCH_ENTRANCE(DNGN_ENTER_CRYPT), +BRANCH_EXIT(DNGN_RETURN_FROM_CRYPT), + +BRANCH_ENTRANCE(DNGN_ENTER_TEMPLE), +BRANCH_EXIT(DNGN_RETURN_FROM_TEMPLE), + +BRANCH_ENTRANCE(DNGN_ENTER_SNAKE), +BRANCH_EXIT(DNGN_RETURN_FROM_SNAKE), + +BRANCH_ENTRANCE(DNGN_ENTER_ELF), +BRANCH_EXIT(DNGN_RETURN_FROM_ELF), + +BRANCH_ENTRANCE(DNGN_ENTER_TOMB), +BRANCH_EXIT(DNGN_RETURN_FROM_TOMB), + +BRANCH_ENTRANCE(DNGN_ENTER_SWAMP), +BRANCH_EXIT(DNGN_RETURN_FROM_SWAMP), + +BRANCH_ENTRANCE(DNGN_ENTER_SHOALS), +BRANCH_EXIT(DNGN_RETURN_FROM_SHOALS), + +BRANCH_ENTRANCE(DNGN_ENTER_SPIDER), +BRANCH_EXIT(DNGN_RETURN_FROM_SPIDER), + +BRANCH_ENTRANCE(DNGN_ENTER_DEPTHS), +BRANCH_EXIT(DNGN_RETURN_FROM_DEPTHS), + +#define ALTAR(enum, colour)\ +{\ + enum,\ + DCHAR_ALTAR, 0, 0,\ + colour, DARKGREY, colour, colour, colour,\ + FFT_NOTABLE, MF_FEATURE,\ +} + +ALTAR(DNGN_UNKNOWN_ALTAR, BLACK), +ALTAR(DNGN_ALTAR_ZIN, LIGHTGREY), +ALTAR(DNGN_ALTAR_SHINING_ONE, YELLOW), +ALTAR(DNGN_ALTAR_KIKUBAAQUDGHA, DARKGREY), +ALTAR(DNGN_ALTAR_YREDELEMNUL, ETC_UNHOLY), +ALTAR(DNGN_ALTAR_XOM, ETC_RANDOM), +ALTAR(DNGN_ALTAR_VEHUMET, ETC_VEHUMET), +ALTAR(DNGN_ALTAR_OKAWARU, CYAN), +ALTAR(DNGN_ALTAR_MAKHLEB, ETC_FIRE), +ALTAR(DNGN_ALTAR_SIF_MUNA, BLUE), +ALTAR(DNGN_ALTAR_TROG, RED), +ALTAR(DNGN_ALTAR_NEMELEX_XOBEH, LIGHTMAGENTA), +ALTAR(DNGN_ALTAR_ELYVILON, WHITE), +ALTAR(DNGN_ALTAR_LUGONU, MAGENTA), +ALTAR(DNGN_ALTAR_BEOGH, ETC_BEOGH), +ALTAR(DNGN_ALTAR_JIYVA, ETC_SLIME), +ALTAR(DNGN_ALTAR_FEDHAS, GREEN), +ALTAR(DNGN_ALTAR_CHEIBRIADOS, LIGHTCYAN), +ALTAR(DNGN_ALTAR_ASHENZARI, LIGHTRED), +ALTAR(DNGN_ALTAR_DITHMENOS, ETC_DITHMENOS), +ALTAR(DNGN_ALTAR_GOZAG, ETC_GOLD), // for the Gold God! +ALTAR(DNGN_ALTAR_QAZLAL, ETC_ELEMENTAL), + +#define FOUNTAIN(enum, colour)\ +{\ + enum,\ + DCHAR_FOUNTAIN, 0, 0,\ + COLOUR_IS(colour),\ + FFT_NONE, MF_FEATURE,\ +} +FOUNTAIN(DNGN_FOUNTAIN_BLUE, BLUE), +FOUNTAIN(DNGN_FOUNTAIN_SPARKLING, LIGHTBLUE), +FOUNTAIN(DNGN_FOUNTAIN_BLOOD, RED), +FOUNTAIN(DNGN_DRY_FOUNTAIN, LIGHTGREY), +#if TAG_MAJOR_VERSION == 34 +FOUNTAIN(DNGN_DRY_FOUNTAIN_BLUE, LIGHTGREY), +FOUNTAIN(DNGN_DRY_FOUNTAIN_SPARKLING, LIGHTGREY), +FOUNTAIN(DNGN_DRY_FOUNTAIN_BLOOD, LIGHTGREY), +#endif + +{ + DNGN_TELEPORTER, + DCHAR_TELEPORTER, 0, 0, + COLOUR_AND_MAP(YELLOW), + FFT_NONE, MF_FEATURE, +}, + +{ + DNGN_SEALED_STAIRS_UP, + DCHAR_STAIRS_UP, 0, 0, + COLOUR_AND_MAP(LIGHTGREEN), + FFT_NONE, MF_STAIR_UP, +}, + +{ + DNGN_SEALED_STAIRS_DOWN, + DCHAR_STAIRS_DOWN, 0, 0, + COLOUR_AND_MAP(LIGHTGREEN), + FFT_NONE, MF_STAIR_DOWN, +}, + +{ + DNGN_ABYSSAL_STAIR, + DCHAR_STAIRS_DOWN, 0, 0, + COLOUR_AND_MAP(LIGHTCYAN), + FFT_NONE, MF_STAIR_BRANCH, +}, + +}; diff --git a/crawl-ref/source/feature.cc b/crawl-ref/source/feature.cc index d7fe4594e5..2f03837522 100644 --- a/crawl-ref/source/feature.cc +++ b/crawl-ref/source/feature.cc @@ -7,10 +7,30 @@ #include "show.h" #include "terrain.h" -static FixedVector<feature_def, NUM_FEATURES> feat_defs; +#include "feature-data.h" static FixedVector<feature_def, NUM_SHOW_ITEMS> item_defs; +static int feat_index[NUM_FEATURES]; static feature_def invis_fd, cloud_fd; +/** Give a feature_def some reasonable defaults. + * + * XXX: This is kind of what a default constructor is for, but until + * we add C++11 support we can't have aggregate initialisation (in feature-data.h) + * and a constructor. + * + * @param[out] The new feature_def to be given values. + */ +void init_fd(feature_def &fd) +{ + fd.feat = DNGN_UNSEEN; + fd.dchar = NUM_DCHAR_TYPES; + fd.symbol = fd.magic_symbol = 0; + fd.colour = fd.seen_colour = fd.em_colour = fd.seen_em_colour = BLACK; + fd.map_colour = DARKGREY; + fd.flags = FFT_NONE; + fd.minimap = MF_UNSEEN; +} + const feature_def &get_feature_def(show_type object) { switch (object.cls) @@ -27,7 +47,7 @@ const feature_def &get_feature_def(show_type object) if (object.item != SHOW_ITEM_NONE) return item_defs[object.item]; case SH_FEATURE: - return feat_defs[object.feat]; + return get_feature_def(object.feat); default: die("invalid show object: class %d", object.cls); } @@ -35,17 +55,13 @@ const feature_def &get_feature_def(show_type object) const feature_def &get_feature_def(dungeon_feature_type feat) { - return feat_defs[feat]; + ASSERT_RANGE(feat, 0, NUM_FEATURES); + ASSERT(feat_index[feat] != -1); + return feat_defs[feat_index[feat]]; } -static void _fd_symbols(feature_def &f) +static void _create_colours(feature_def &f) { - if (!f.symbol && f.dchar != NUM_DCHAR_TYPES) - f.symbol = Options.char_table[f.dchar]; - - if (!f.magic_symbol) - f.magic_symbol = f.symbol; - if (f.seen_colour == BLACK) f.seen_colour = f.map_colour; @@ -56,6 +72,15 @@ static void _fd_symbols(feature_def &f) f.em_colour = f.colour; } +static void _create_symbols(feature_def &f) +{ + if (!f.symbol && f.dchar != NUM_DCHAR_TYPES) + f.symbol = Options.char_table[f.dchar]; + + if (!f.magic_symbol) + f.magic_symbol = f.symbol; +} + static void _apply_feature_overrides() { for (map<dungeon_feature_type, feature_def>::const_iterator fo @@ -64,7 +89,8 @@ static void _apply_feature_overrides() ++fo) { const feature_def &ofeat = fo->second; - feature_def &feat = feat_defs[fo->first]; + // Replicating get_feature_def since we need not-const. + feature_def &feat = feat_defs[feat_index[fo->first]]; ucs_t c; if (ofeat.symbol && (c = get_glyph_override(ofeat.symbol))) @@ -84,503 +110,51 @@ static void _apply_feature_overrides() } } -static colour_t _feat_colour(dungeon_feature_type feat) +static void _init_feature_index() { - switch (feat) - { - case DNGN_ENTER_VAULTS: return LIGHTGREEN; - case DNGN_ENTER_ZOT: return MAGENTA; - case DNGN_ENTER_HELL: return RED; - case DNGN_ENTER_DIS: return CYAN; - case DNGN_ENTER_GEHENNA: return RED; - case DNGN_ENTER_COCYTUS: return LIGHTCYAN; - case DNGN_ENTER_TARTARUS: return MAGENTA; - case DNGN_ENTER_ABYSS: return ETC_WARP; - case DNGN_EXIT_THROUGH_ABYSS: return ETC_WARP; - case DNGN_ENTER_PANDEMONIUM: return LIGHTBLUE; - case DNGN_ENTER_TROVE: return BLUE; - case DNGN_ENTER_SEWER: return LIGHTGREEN; - case DNGN_ENTER_OSSUARY: return BROWN; - case DNGN_ENTER_BAILEY: return LIGHTRED; - case DNGN_ENTER_ICE_CAVE: return WHITE; - case DNGN_ENTER_VOLCANO: return RED; - case DNGN_EXIT_DUNGEON: return LIGHTBLUE; - case DNGN_RETURN_FROM_ZOT: return MAGENTA; - case DNGN_EXIT_HELL: return LIGHTRED; - case DNGN_EXIT_ABYSS: return ETC_WARP; - case DNGN_EXIT_PANDEMONIUM: return LIGHTBLUE; - case DNGN_TRANSIT_PANDEMONIUM: return LIGHTGREEN; - case DNGN_EXIT_TROVE: return BLUE; - case DNGN_EXIT_SEWER: return BROWN; - case DNGN_EXIT_OSSUARY: return BROWN; - case DNGN_EXIT_ICE_CAVE: return WHITE; - case DNGN_EXIT_VOLCANO: return RED; + for (int i = 0; i < NUM_FEATURES; ++i) + feat_index[i] = -1; - case DNGN_ALTAR_ZIN: return LIGHTGREY; - case DNGN_ALTAR_SHINING_ONE: return YELLOW; - case DNGN_ALTAR_KIKUBAAQUDGHA: return DARKGREY; - case DNGN_ALTAR_YREDELEMNUL: return ETC_UNHOLY; - case DNGN_ALTAR_XOM: return ETC_RANDOM; - case DNGN_ALTAR_VEHUMET: return ETC_VEHUMET; - case DNGN_ALTAR_OKAWARU: return CYAN; - case DNGN_ALTAR_MAKHLEB: return ETC_FIRE; - case DNGN_ALTAR_SIF_MUNA: return BLUE; - case DNGN_ALTAR_TROG: return RED; - case DNGN_ALTAR_NEMELEX_XOBEH: return LIGHTMAGENTA; - case DNGN_ALTAR_ELYVILON: return WHITE; - case DNGN_ALTAR_LUGONU: return MAGENTA; - case DNGN_ALTAR_BEOGH: return ETC_BEOGH; - case DNGN_ALTAR_JIYVA: return ETC_SLIME; - case DNGN_ALTAR_FEDHAS: return GREEN; - case DNGN_ALTAR_CHEIBRIADOS: return LIGHTCYAN; - case DNGN_ALTAR_ASHENZARI: return LIGHTRED; - case DNGN_ALTAR_DITHMENOS: return ETC_DITHMENOS; - case DNGN_ALTAR_GOZAG: return ETC_GOLD; // for the Gold God! - case DNGN_ALTAR_QAZLAL: return ETC_ELEMENTAL; - default: return 0; - } -} - -static void _init_feat(feature_def &f, dungeon_feature_type feat) -{ - f.colour = f.seen_colour = _feat_colour(feat); - - switch (feat) + for (int i = 0; i < (int) ARRAYSZ(feat_defs); ++i) { - default: - if (feat >= DNGN_ENTER_FIRST_PORTAL && feat <= DNGN_ENTER_LAST_PORTAL -#if TAG_MAJOR_VERSION == 34 - || feat == DNGN_ENTER_PORTAL_VAULT -#endif - || feat == DNGN_ENTER_LABYRINTH - || feat == DNGN_ENTER_HELL - || feat >= DNGN_ENTER_DIS && feat <= DNGN_ENTER_ABYSS - || feat == DNGN_ENTER_PANDEMONIUM - || feat == DNGN_EXIT_THROUGH_ABYSS - || feat == DNGN_ENTER_VAULTS - || feat == DNGN_ENTER_ZOT) - { - if (!f.colour) - f.colour = f.seen_colour = ETC_SHIMMER_BLUE; - f.dchar = DCHAR_ARCH; - f.map_colour = LIGHTGREY; - f.minimap = MF_PORTAL; - f.flags |= FFT_NOTABLE; - if (feat == DNGN_ENTER_LABYRINTH) - f.flags |= FFT_EXAMINE_HINT; - break; - } - else if (feat >= DNGN_EXIT_FIRST_PORTAL && feat <= DNGN_EXIT_LAST_PORTAL -#if TAG_MAJOR_VERSION == 34 - || feat == DNGN_EXIT_PORTAL_VAULT -#endif - || feat == DNGN_EXIT_HELL - || feat == DNGN_EXIT_ABYSS - || feat == DNGN_EXIT_PANDEMONIUM - || feat == DNGN_TRANSIT_PANDEMONIUM - || feat == DNGN_RETURN_FROM_VAULTS - || feat == DNGN_RETURN_FROM_ZOT) - { - if (!f.colour) - f.colour = f.seen_colour = ETC_SHIMMER_BLUE; - f.dchar = DCHAR_ARCH; - f.map_colour = LIGHTGREY; - f.minimap = MF_PORTAL; - break; - } - else if (feat >= DNGN_ENTER_FIRST_BRANCH && feat <= DNGN_ENTER_LAST_BRANCH) - { - if (!f.colour) - f.colour = f.seen_colour = YELLOW; - f.dchar = DCHAR_STAIRS_DOWN; - f.flags |= FFT_NOTABLE; - f.map_colour = RED; - f.minimap = MF_STAIR_BRANCH; - if (feat == DNGN_ENTER_ORC || feat == DNGN_ENTER_SLIME) - f.flags |= FFT_EXAMINE_HINT; - break; - } - else if (feat >= DNGN_RETURN_FROM_FIRST_BRANCH && feat <= DNGN_RETURN_FROM_LAST_BRANCH - || feat == DNGN_EXIT_DUNGEON) - { - if (!f.colour) - f.colour = f.seen_colour = YELLOW; - f.dchar = DCHAR_STAIRS_UP; - f.map_colour = GREEN; - f.minimap = MF_STAIR_UP; - break; - } - else if (feat_is_altar(feat) || feat == DNGN_UNKNOWN_ALTAR) - { - f.dchar = DCHAR_ALTAR; - f.flags |= FFT_NOTABLE; - f.map_colour = DARKGREY; - f.minimap = MF_FEATURE; - break; - - } - break; - case DNGN_UNSEEN: - case DNGN_EXPLORE_HORIZON: - break; - - case DNGN_ROCK_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: - f.dchar = DCHAR_WALL; - f.colour = LIGHTGRAY; - f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ]; - f.minimap = MF_WALL; - break; - - case DNGN_SLIMY_WALL: - f.dchar = DCHAR_WALL; - f.colour = LIGHTGREEN; - f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ]; - f.minimap = MF_WALL; - break; - - case DNGN_PERMAROCK_WALL: - f.dchar = DCHAR_PERMAWALL; - f.colour = ETC_ROCK; - f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ]; - f.minimap = MF_WALL; - break; - - case DNGN_CLEAR_ROCK_WALL: - case DNGN_CLEAR_STONE_WALL: - f.dchar = DCHAR_WALL; - f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ]; - f.colour = LIGHTCYAN; - f.minimap = MF_WALL; - break; - - case DNGN_CLEAR_PERMAROCK_WALL: - f.dchar = DCHAR_PERMAWALL; - f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ]; - f.colour = LIGHTCYAN; - f.minimap = MF_WALL; - break; - - case DNGN_GRATE: - f.dchar = DCHAR_GRATE; - f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ]; - f.colour = LIGHTBLUE; - f.minimap = MF_WALL; - break; - - case DNGN_TREE: - f.dchar = DCHAR_TREE; - f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ]; - f.colour = ETC_TREE; - f.minimap = MF_WALL; - break; - - case DNGN_OPEN_SEA: - f.dchar = DCHAR_WALL; - f.colour = BLUE; - f.minimap = MF_DEEP_WATER; - break; - - case DNGN_LAVA_SEA: - f.dchar = DCHAR_WAVY; - f.colour = RED; - f.minimap = MF_LAVA; - break; - - case DNGN_OPEN_DOOR: - f.dchar = DCHAR_DOOR_OPEN; - f.colour = LIGHTGREY; - f.minimap = MF_DOOR; - break; - - case DNGN_CLOSED_DOOR: - f.dchar = DCHAR_DOOR_CLOSED; - f.colour = LIGHTGREY; - f.minimap = MF_DOOR; - break; - - case DNGN_RUNED_DOOR: - f.dchar = DCHAR_DOOR_CLOSED; - f.colour = LIGHTBLUE; - f.minimap = MF_DOOR; - f.map_colour = LIGHTBLUE; - break; - - case DNGN_SEALED_DOOR: - f.dchar = DCHAR_DOOR_CLOSED; - f.colour = LIGHTGREEN; - f.minimap = MF_DOOR; - f.map_colour = LIGHTGREEN; - break; - - case DNGN_METAL_WALL: - f.dchar = DCHAR_WALL; - f.colour = CYAN; - f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ]; - f.minimap = MF_WALL; - break; - - case DNGN_GREEN_CRYSTAL_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: - f.dchar = DCHAR_STATUE; - f.colour = BROWN; - f.minimap = MF_WALL; - break; - - case DNGN_GRANITE_STATUE: - f.dchar = DCHAR_STATUE; - f.colour = DARKGREY; - f.minimap = MF_WALL; - break; - - case DNGN_LAVA: - f.dchar = DCHAR_WAVY; - f.colour = RED; - f.minimap = MF_LAVA; - break; - - case DNGN_DEEP_WATER: - f.dchar = DCHAR_WAVY; - f.colour = BLUE; - f.minimap = MF_DEEP_WATER; - break; - - case DNGN_SHALLOW_WATER: - f.dchar = DCHAR_WAVY; - f.colour = CYAN; - f.minimap = MF_WATER; - break; - - case DNGN_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_TELEPORTER: - f.dchar = DCHAR_TELEPORTER; - f.colour = YELLOW; - f.map_colour = YELLOW; - f.minimap = MF_FEATURE; - break; - - case DNGN_TRAP_MECHANICAL: - f.colour = LIGHTCYAN; - f.dchar = DCHAR_TRAP; - f.map_colour = LIGHTCYAN; - f.minimap = MF_TRAP; - break; - - case DNGN_TRAP_TELEPORT: - f.colour = f.map_colour = LIGHTBLUE; - f.dchar = DCHAR_TRAP; - f.minimap = MF_TRAP; - break; - - case DNGN_TRAP_ALARM: - f.colour = f.map_colour = LIGHTRED; - f.dchar = DCHAR_TRAP; - f.minimap = MF_TRAP; - break; - - case DNGN_TRAP_ZOT: - f.colour = f.map_colour = LIGHTMAGENTA; - f.dchar = DCHAR_TRAP; - f.minimap = MF_TRAP; - break; - - case DNGN_PASSAGE_OF_GOLUBRIA: - f.colour = f.map_colour = GREEN; - f.dchar = DCHAR_TRAP; - f.minimap = MF_TRAP; - break; - - case DNGN_TRAP_SHAFT: - f.colour = BROWN; - f.dchar = DCHAR_TRAP; - f.map_colour = BROWN; - f.minimap = MF_TRAP; - break; - - case DNGN_TRAP_WEB: - f.colour = LIGHTGREY; - f.dchar = DCHAR_TRAP; - f.map_colour = LIGHTGREY; - f.minimap = MF_TRAP; - break; - - case DNGN_UNDISCOVERED_TRAP: - 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: - 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_MALIGN_GATEWAY: - f.dchar = DCHAR_ARCH; - f.colour = ETC_SHIMMER_BLUE; - f.map_colour = LIGHTGREY; - f.colour = ETC_SHIMMER_BLUE; - f.minimap = MF_STAIR_UP; - break; - - case DNGN_EXPIRED_PORTAL: - f.dchar = DCHAR_FLOOR; - f.colour = BROWN; - f.magic_symbol = Options.char_table[ DCHAR_FLOOR_MAGIC ]; - f.minimap = MF_FLOOR; - break; - - case DNGN_ESCAPE_HATCH_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: - f.dchar = DCHAR_STAIRS_DOWN; - f.colour = RED; - f.em_colour = WHITE; - f.map_colour = RED; - f.seen_em_colour = WHITE; - f.minimap = MF_STAIR_DOWN; - break; - - case DNGN_SEALED_STAIRS_DOWN: - f.dchar = DCHAR_STAIRS_DOWN; - f.colour = LIGHTGREEN; - f.map_colour = LIGHTGREEN; - f.minimap = MF_STAIR_DOWN; - break; - - case DNGN_ESCAPE_HATCH_UP: - case DNGN_EXIT_LABYRINTH: - 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: - f.dchar = DCHAR_STAIRS_UP; - f.colour = GREEN; - f.map_colour = GREEN; - f.em_colour = WHITE; - f.seen_em_colour = WHITE; - f.minimap = MF_STAIR_UP; - break; - - case DNGN_SEALED_STAIRS_UP: - f.dchar = DCHAR_STAIRS_UP; - f.colour = LIGHTGREEN; - f.map_colour = LIGHTGREEN; - f.minimap = MF_STAIR_UP; - break; - - case DNGN_ABYSSAL_STAIR: - f.colour = LIGHTCYAN; - f.dchar = DCHAR_STAIRS_DOWN; - f.map_colour = LIGHTCYAN; - f.minimap = MF_STAIR_BRANCH; - break; - - case DNGN_STONE_ARCH: - case DNGN_ABANDONED_SHOP: - f.colour = LIGHTGREY; - f.dchar = DCHAR_ARCH; - f.map_colour = LIGHTGREY; - f.minimap = MF_FLOOR; - break; - - case DNGN_FOUNTAIN_BLUE: - f.colour = BLUE; - f.dchar = DCHAR_FOUNTAIN; - f.minimap = MF_FEATURE; - break; - - case DNGN_FOUNTAIN_SPARKLING: - f.colour = LIGHTBLUE; - f.dchar = DCHAR_FOUNTAIN; - f.minimap = MF_FEATURE; - break; - - case DNGN_FOUNTAIN_BLOOD: - f.colour = RED; - f.dchar = DCHAR_FOUNTAIN; - f.minimap = MF_FEATURE; - break; - - case DNGN_DRY_FOUNTAIN: - f.colour = LIGHTGREY; - f.dchar = DCHAR_FOUNTAIN; - f.minimap = MF_FEATURE; - break; - - case DNGN_UNKNOWN_PORTAL: - f.colour = LIGHTGREY; - f.dchar = DCHAR_ARCH; - f.minimap = MF_PORTAL; - break; + const dungeon_feature_type feat = feat_defs[i].feat; + ASSERT_RANGE(feat, 0, NUM_FEATURES); + ASSERT(feat_index[feat] == -1); + feat_index[feat] = i; } } void init_show_table() { - show_type obj; - for (int i = 0; i < NUM_FEATURES; i++) - { - dungeon_feature_type feat = static_cast<dungeon_feature_type>(i); - _init_feat(feat_defs[feat], feat); - } + _init_feature_index(); _apply_feature_overrides(); - for (int i = 0; i < NUM_FEATURES; i++) - _fd_symbols(feat_defs[i]); + for (int i = 0; i < (int) ARRAYSZ(feat_defs); i++) + _create_symbols(feat_defs[i]); for (int i = 0; i < NUM_SHOW_ITEMS; i++) { show_item_type si = static_cast<show_item_type>(i); // SHOW_ITEM_NONE is bogus, but "invis exposed" is an ok placeholder COMPILE_CHECK(DCHAR_ITEM_AMULET - DCHAR_ITEM_DETECTED + 2 == NUM_SHOW_ITEMS); + init_fd(item_defs[si]); item_defs[si].minimap = MF_ITEM; item_defs[si].dchar = static_cast<dungeon_char_type>(i + DCHAR_ITEM_DETECTED - SHOW_ITEM_DETECTED); - _fd_symbols(item_defs[si]); + _create_symbols(item_defs[si]); + _create_colours(item_defs[si]); } + init_fd(invis_fd); invis_fd.dchar = DCHAR_INVIS_EXPOSED; invis_fd.minimap = MF_MONS_HOSTILE; - _fd_symbols(invis_fd); + _create_symbols(invis_fd); + _create_colours(invis_fd); + init_fd(invis_fd); cloud_fd.dchar = DCHAR_CLOUD; cloud_fd.minimap = MF_SKIP; - _fd_symbols(cloud_fd); + _create_symbols(cloud_fd); + _create_colours(cloud_fd); } dungeon_feature_type magic_map_base_feat(dungeon_feature_type feat) diff --git a/crawl-ref/source/feature.h b/crawl-ref/source/feature.h index 7690f6b2b4..aacadd7db1 100644 --- a/crawl-ref/source/feature.h +++ b/crawl-ref/source/feature.h @@ -5,33 +5,23 @@ struct feature_def { - dungeon_char_type dchar; - ucs_t symbol; // symbol used for seen terrain - ucs_t 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 env.map_knowledge().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 - - feature_def() : - dchar(NUM_DCHAR_TYPES), - symbol(0), - magic_symbol(0), - colour(BLACK), - map_colour(DARKGREY), - seen_colour(BLACK), - em_colour(BLACK), - seen_em_colour(BLACK), - flags(FFT_NONE), - minimap(MF_UNSEEN) - {} + dungeon_feature_type feat; + dungeon_char_type dchar; // used for creating symbol + ucs_t symbol; // symbol used for seen terrain + ucs_t 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 env.map_knowledge().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; } }; +void init_fd(feature_def& fd); + const feature_def &get_feature_def(show_type object); const feature_def &get_feature_def(dungeon_feature_type feat); diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc index 4b00d7af74..5e7781184d 100644 --- a/crawl-ref/source/initfile.cc +++ b/crawl-ref/source/initfile.cc @@ -1311,6 +1311,7 @@ void game_options::add_feature_override(const string &text) if (feats[i] >= NUM_FEATURES) continue; // TODO: handle other object types. feature_def &fov(feature_overrides[feats[i]]); + init_fd(fov); #define SYM(n, field) if (ucs_t s = read_symbol(iprops[n])) \ fov.field = s; #define COL(n, field) if (unsigned short c = str_to_colour(iprops[n], BLACK)) \ |