summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/spl-util.cc
diff options
context:
space:
mode:
authorzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2007-12-06 09:54:50 +0000
committerzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2007-12-06 09:54:50 +0000
commit47173f1092b4f4f3bdc0da19d6dc4553f62cdee7 (patch)
treeb5d87980beec66a00b2314ca94475ac2715e71ae /crawl-ref/source/spl-util.cc
parent7640ea1ef75cecb46066e956ec446038c884643c (diff)
downloadcrawl-ref-47173f1092b4f4f3bdc0da19d6dc4553f62cdee7.tar.gz
crawl-ref-47173f1092b4f4f3bdc0da19d6dc4553f62cdee7.zip
"?/" can now be used to look up items. A side effect of this is that
item descriptions have been moved to dat/descript/items.txt and dat/descript/unident.txt. STL maps are now used to look up exact matches for the names of monsters, features and spells, so that looking them up with "?/" won't get too slow if there's a large descriptions DB and each key has to be tested if its a monster/spell/etc. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3009 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/spl-util.cc')
-rw-r--r--crawl-ref/source/spl-util.cc32
1 files changed, 28 insertions, 4 deletions
diff --git a/crawl-ref/source/spl-util.cc b/crawl-ref/source/spl-util.cc
index 9cbaace2df..1a35365798 100644
--- a/crawl-ref/source/spl-util.cc
+++ b/crawl-ref/source/spl-util.cc
@@ -76,13 +76,39 @@ void init_spell_descs(void)
spell_list[spelldata[i].id] = i;
} // end init_spell_descs()
+typedef std::map<std::string, spell_type> spell_name_map;
+static spell_name_map spell_name_cache;
+
+void init_spell_name_cache()
+{
+ for (int i = 0; i < NUM_SPELLS; i++)
+ {
+ spell_type type = static_cast<spell_type>(i);
+ const char *sptitle = spell_title(type);
+ if (!sptitle)
+ continue;
+
+ const std::string spell_name = lowercase_string(sptitle);
+ spell_name_cache[spell_name] = type;
+ }
+}
+
spell_type spell_by_name(std::string name, bool partial_match)
{
if (name.empty())
return (SPELL_NO_SPELL);
-
lowercase(name);
+ if (!partial_match)
+ {
+ spell_name_map::iterator i = spell_name_cache.find(name);
+
+ if (i != spell_name_cache.end())
+ return (i->second);
+
+ return (SPELL_NO_SPELL);
+ }
+
int spellmatch = -1;
for (int i = 0; i < NUM_SPELLS; i++)
{
@@ -92,10 +118,8 @@ spell_type spell_by_name(std::string name, bool partial_match)
continue;
const std::string spell_name = lowercase_string(sptitle);
- if (name == spell_name)
- return (type);
- if (partial_match && spell_name.find(name) != std::string::npos)
+ if (spell_name.find(name) != std::string::npos)
spellmatch = i;
}