#pragma once #include #include #include #include "Version.hh" enum class QuestCategory { Unknown = -1, Retrieval = 0, Extermination, Event, Shop, VR, Tower, GovernmentEpisode1, GovernmentEpisode2, GovernmentEpisode4, Download, Battle, Challenge, Solo, Episode3, }; bool category_is_mode(QuestCategory category); const char* name_for_category(QuestCategory category); struct Quest { 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 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); 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 std::string& file_basename) 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 char* 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, uint8_t episode) const; }; Quest create_download_quest(const Quest& src, size_t version);