summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/feature.cc
diff options
context:
space:
mode:
authorAdam Borowski <kilobyte@angband.pl>2013-12-06 03:56:05 +0100
committerAdam Borowski <kilobyte@angband.pl>2013-12-06 04:00:23 +0100
commitc9c663e6f2d6cd4547decd6466a7571e09ad0430 (patch)
tree99f8c4c273bcd7d85f2acb69c16f3d14dc17975b /crawl-ref/source/feature.cc
parentf6a881ee62a7f4699649faca211e05d2783b62bc (diff)
downloadcrawl-ref-c9c663e6f2d6cd4547decd6466a7571e09ad0430.tar.gz
crawl-ref-c9c663e6f2d6cd4547decd6466a7571e09ad0430.zip
Optimize get_feature_def().
This bizarre map took around 4% of qw CPU. Separating the defs into something directly addressable costs nothing but a minor duplication during initialization that could be put into a function.
Diffstat (limited to 'crawl-ref/source/feature.cc')
-rw-r--r--crawl-ref/source/feature.cc106
1 files changed, 53 insertions, 53 deletions
diff --git a/crawl-ref/source/feature.cc b/crawl-ref/source/feature.cc
index e6a117b7d9..5beed21ae3 100644
--- a/crawl-ref/source/feature.cc
+++ b/crawl-ref/source/feature.cc
@@ -6,25 +6,54 @@
#include "options.h"
#include "show.h"
-typedef map<show_type, feature_def> feat_map;
-static feat_map Features;
+static FixedVector<feature_def, NUM_FEATURES> feat_defs;
+static FixedVector<feature_def, NUM_SHOW_ITEMS> item_defs;
+static feature_def invis_fd(DCHAR_INVIS_EXPOSED, MF_MONS_HOSTILE);
+static feature_def cloud_fd(DCHAR_CLOUD, MF_SKIP);
const feature_def &get_feature_def(show_type object)
{
- // If this is a monster that is hidden explicitly, show items if
- // any instead, or the base feature if there are no items.
- if (object.cls == SH_MONSTER)
- object.cls = (object.item != SHOW_ITEM_NONE) ? SH_ITEM : SH_FEATURE;
- return Features[object];
+ switch(object.cls)
+ {
+ case SH_INVIS_EXPOSED:
+ return invis_fd;
+ case SH_CLOUD:
+ return cloud_fd;
+ case SH_ITEM:
+ return item_defs[object.item];
+ case SH_MONSTER:
+ // If this is a monster that is hidden explicitly, show items if
+ // any instead, or the base feature if there are no items.
+ if (object.item != SHOW_ITEM_NONE)
+ return item_defs[object.item];
+ case SH_FEATURE:
+ return feat_defs[object.feat];
+ default:
+ die("invalid show object: class %d", object.cls);
+ }
}
const feature_def &get_feature_def(dungeon_feature_type feat)
{
- ASSERT(feat < NUM_FEATURES);
- show_type object;
- object.cls = SH_FEATURE;
- object.feat = feat;
- return Features[object];
+ return feat_defs[feat];
+}
+
+static void _fd_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;
+
+ 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;
}
static void _apply_feature_overrides()
@@ -35,7 +64,7 @@ static void _apply_feature_overrides()
++fo)
{
const feature_def &ofeat = fo->second;
- feature_def &feat = Features[fo->first];
+ feature_def &feat = feat_defs[fo->first];
ucs_t c;
if (ofeat.symbol && (c = get_glyph_override(ofeat.symbol)))
@@ -778,55 +807,26 @@ void init_show_table(void)
show_type obj;
for (int i = 0; i < NUM_FEATURES; i++)
{
- obj.cls = SH_FEATURE;
- obj.feat = static_cast<dungeon_feature_type>(i);
-
- _init_feat(Features[obj], obj.feat);
+ dungeon_feature_type feat = static_cast<dungeon_feature_type>(i);
+ _init_feat(feat_defs[feat], feat);
}
-
- obj.cls = SH_INVIS_EXPOSED;
- Features[obj].dchar = DCHAR_INVIS_EXPOSED;
- Features[obj].minimap = MF_MONS_HOSTILE;
+ _apply_feature_overrides();
+ for (int i = 0; i < NUM_FEATURES; i++)
+ _fd_symbols(feat_defs[i]);
for (int i = 0; i < NUM_SHOW_ITEMS; i++)
{
- obj.cls = SH_ITEM;
- obj.item = static_cast<show_item_type>(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);
- Features[obj].minimap = MF_ITEM;
- Features[obj].dchar = static_cast<dungeon_char_type>(i
+ 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]);
}
- obj.cls = SH_CLOUD;
- Features[obj].dchar = DCHAR_CLOUD;
- Features[obj].minimap = MF_SKIP;
-
- for (feat_map::iterator i = Features.begin(); i != Features.end(); ++i)
- {
- feature_def &f = i->second;
- if (f.dchar != NUM_DCHAR_TYPES)
- f.symbol = Options.char_table[f.dchar];
- }
-
- _apply_feature_overrides();
-
- for (feat_map::iterator i = Features.begin(); i != Features.end(); ++i)
- {
- feature_def &f = i->second;
- if (!f.magic_symbol)
- f.magic_symbol = f.symbol;
-
- 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;
- }
+ _fd_symbols(invis_fd);
+ _fd_symbols(cloud_fd);
}
dungeon_feature_type magic_map_base_feat(dungeon_feature_type feat)