#pragma once #include #include #include #include #include #include "Version.hh" enum class QuestCategory { UNKNOWN = -1, RETRIEVAL = 0, EXTERMINATION, EVENT, SHOP, VR, TOWER, GOVERNMENT_EPISODE_1, GOVERNMENT_EPISODE_2, GOVERNMENT_EPISODE_4, DOWNLOAD, BATTLE, CHALLENGE, SOLO, EPISODE_3, }; bool category_is_mode(QuestCategory category); const char* name_for_category(QuestCategory category); class Quest { private: static std::string decode_gci(const std::string& filename); public: int64_t quest_id; QuestCategory category; uint8_t episode; // 0 = ep1, 1 = ep2, 2 = ep4, 0xFF = ep3 bool is_dcv1; bool joinable; GameVersion version; std::string file_basename; // we append -. when reading bool gci_format; std::u16string name; std::u16string short_description; std::u16string long_description; // these are populated when requested mutable std::shared_ptr bin_contents_ptr; mutable std::shared_ptr dat_contents_ptr; Quest(const std::string& file_basename); Quest(const Quest&) = default; Quest(Quest&&) = default; Quest& operator=(const Quest&) = default; Quest& operator=(Quest&&) = default; std::string bin_filename() const; std::string dat_filename() const; std::shared_ptr bin_contents() const; std::shared_ptr dat_contents() const; std::shared_ptr create_download_quest() const; }; struct QuestIndex { std::string directory; std::map, std::shared_ptr> version_id_to_quest; std::map, std::shared_ptr> version_name_to_quest; std::map>> category_to_quests; std::map> gba_file_contents; QuestIndex(const std::string& directory); std::shared_ptr get(GameVersion version, uint32_t id) const; std::shared_ptr get_gba(const std::string& name) const; std::vector> filter(GameVersion version, bool is_dcv1, QuestCategory category, int16_t episode) const; };