diff --git a/src/Episode3/DataIndexes.cc b/src/Episode3/DataIndexes.cc index d54ae69c..274de718 100644 --- a/src/Episode3/DataIndexes.cc +++ b/src/Episode3/DataIndexes.cc @@ -1769,6 +1769,7 @@ CardIndex::CardIndex(const string& filename, const string& decompressed_filename // unindexed (they can still be looked up by ID, of course) string name = entry->def.en_name; this->card_definitions_by_name.emplace(name, entry); + this->card_definitions_by_name_normalized.emplace(this->normalize_card_name(name), entry); entry->def.hp.decode_code(); entry->def.ap.decode_code(); @@ -1840,6 +1841,10 @@ shared_ptr CardIndex::definition_for_name(const stri return this->card_definitions_by_name.at(name); } +shared_ptr CardIndex::definition_for_name_normalized(const string& name) const { + return this->card_definitions_by_name_normalized.at(this->normalize_card_name(name)); +} + set CardIndex::all_ids() const { set ret; for (const auto& it : this->card_definitions) { @@ -1852,6 +1857,17 @@ uint64_t CardIndex::definitions_mtime() const { return this->mtime_for_card_definitions; } +string CardIndex::normalize_card_name(const string& name) { + string ret; + for (char ch : name) { + if (ch == ' ') { + continue; + } + ret.push_back(tolower(ch)); + } + return ret; +} + MapIndex::MapIndex(const string& directory) { auto add_maps_from_dir = [&](const string& dir, bool is_quest) -> void { for (const auto& filename : list_directory(dir)) { diff --git a/src/Episode3/DataIndexes.hh b/src/Episode3/DataIndexes.hh index 4df4e126..f54a445b 100644 --- a/src/Episode3/DataIndexes.hh +++ b/src/Episode3/DataIndexes.hh @@ -1048,13 +1048,17 @@ public: const std::string& get_compressed_definitions() const; std::shared_ptr definition_for_id(uint32_t id) const; std::shared_ptr definition_for_name(const std::string& name) const; + std::shared_ptr definition_for_name_normalized(const std::string& name) const; std::set all_ids() const; uint64_t definitions_mtime() const; private: + static std::string normalize_card_name(const std::string& name); + std::string compressed_card_definitions; std::unordered_map> card_definitions; std::unordered_map> card_definitions_by_name; + std::unordered_map> card_definitions_by_name_normalized; uint64_t mtime_for_card_definitions; }; diff --git a/src/ServerState.cc b/src/ServerState.cc index ed5c7e4e..4935919f 100644 --- a/src/ServerState.cc +++ b/src/ServerState.cc @@ -833,7 +833,7 @@ void ServerState::load_ep3_data() { config_log.info("Resolving Episode 3 card auction pool"); for (auto& e : this->ep3_card_auction_pool) { try { - const auto& card = this->ep3_card_index->definition_for_name(e.card_name); + const auto& card = this->ep3_card_index->definition_for_name_normalized(e.card_name); e.card_id = card->def.card_id; } catch (const out_of_range&) { throw runtime_error(string_printf("Ep3 card \"%s\" does not exist", e.card_name.c_str()));