diff --git a/src/Quest.cc b/src/Quest.cc index 09bf6a30..af97c9bd 100644 --- a/src/Quest.cc +++ b/src/Quest.cc @@ -335,9 +335,29 @@ uint32_t Quest::versions_key(Version v, uint8_t language) { return (static_cast(v) << 8) | language; } +const string& Quest::name_for_language(uint8_t language) const { + if (!this->names_by_language.at(language).empty()) { + return this->names_by_language[language]; + } + if (!this->names_by_language[1].empty()) { + return this->names_by_language[1]; + } + for (const string& name : this->names_by_language) { + if (!name.empty()) { + return name; + } + } + return this->meta.name; +} + void Quest::add_version(shared_ptr vq) { this->meta.assert_compatible(vq->meta); this->versions.emplace(this->versions_key(vq->version, vq->language), vq); + + auto& name_by_language = this->names_by_language.at(vq->language); + if (name_by_language.empty()) { + name_by_language = vq->meta.name; + } } std::shared_ptr Quest::get_supermap(int64_t random_seed) const { diff --git a/src/Quest.hh b/src/Quest.hh index 9f58e7fb..f42c435c 100644 --- a/src/Quest.hh +++ b/src/Quest.hh @@ -94,6 +94,7 @@ struct Quest { QuestMetadata meta; mutable std::shared_ptr supermap; std::map> versions; + std::array names_by_language; Quest() = delete; explicit Quest(std::shared_ptr initial_version); @@ -106,6 +107,8 @@ struct Quest { std::shared_ptr get_supermap(int64_t random_seed) const; + const std::string& name_for_language(uint8_t language) const; + void add_version(std::shared_ptr vq); bool has_version(Version v, uint8_t language) const; bool has_version_any_language(Version v) const; diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index c987c07a..bceb34b6 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -2265,7 +2265,7 @@ static asio::awaitable on_09(shared_ptr c, Channel::Message& msg) if (game->quest) { info += (game->check_flag(Lobby::Flag::JOINABLE_QUEST_IN_PROGRESS)) ? "$C6Quest: " : "$C4Quest: "; - info += remove_color(game->quest->meta.name); + info += remove_color(game->quest->name_for_language(c->language())); info += "\n"; } else if (game->check_flag(Lobby::Flag::JOINABLE_QUEST_IN_PROGRESS)) { info += "$C6Quest in progress\n";