summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShmuale Mark <shm.mark@gmail.com>2014-07-10 08:15:39 -0400
committerShmuale Mark <shm.mark@gmail.com>2014-07-14 08:47:43 -0400
commitfff14fb3beb1d2e70d702f1cda6a7de6355c2507 (patch)
treeb18cefd32601dc87d815b1573a903537660375d5
parentdc4f2bac322bd5c5cb7073bd8a568aca169ceaf0 (diff)
downloadcrawl-ref-fff14fb3beb1d2e70d702f1cda6a7de6355c2507.tar.gz
crawl-ref-fff14fb3beb1d2e70d702f1cda6a7de6355c2507.zip
Separate feature data into feature-data.h.
-rw-r--r--crawl-ref/source/enum.h4
-rw-r--r--crawl-ref/source/feature-data.h541
-rw-r--r--crawl-ref/source/feature.cc540
-rw-r--r--crawl-ref/source/feature.h36
-rw-r--r--crawl-ref/source/initfile.cc1
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)) \