#pragma once #include #include #include #include #include #include "../audio.hpp" #include "anm2.hpp" #include "sound_entry.hpp" namespace game::resource::xml { class Item { public: static constexpr auto UNDEFINED = "???"; struct Category { std::string name{}; bool isEdible{}; }; struct Rarity { std::string name{UNDEFINED}; float chance{}; bool isHidden{}; Audio sound{}; }; struct Flavor { std::string name{UNDEFINED}; }; struct Entry { std::string name{UNDEFINED}; std::string description{UNDEFINED}; int categoryID{}; int rarityID{}; std::optional upgradeCount{}; std::optional upgradeID{}; std::optional flavorID; std::optional calories{}; std::optional eatSpeedBonus{}; std::optional digestionBonus{}; std::optional gravity{}; std::optional chewCount{}; bool isPlayReward{}; bool isToggleSpritesheet{}; }; struct Animations { std::string chew{}; }; struct Sounds { SoundEntryCollection bounce{}; SoundEntryCollection return_{}; SoundEntryCollection dispose{}; SoundEntryCollection summon{}; SoundEntryCollection upgrade{}; SoundEntryCollection upgradeFail{}; }; std::unordered_map categoryMap{}; std::unordered_map rarityMap{}; std::unordered_map flavorMap{}; std::unordered_map stringToIDMap{}; std::unordered_map idToStringMap{}; using Pool = std::vector; std::vector categories{}; std::vector rarities{}; std::vector flavors{}; std::vector items{}; std::vector anm2s{}; std::vector rarityIDsSortedByChance{}; std::unordered_map pools{}; Pool rewardItemPool{}; Animations animations{}; Sounds sounds{}; Anm2 baseAnm2{}; int chewCount{2}; int quantityMax{99}; bool isValid{}; Item() = default; Item(const std::filesystem::path&); Item(const util::physfs::Path&); bool is_valid() const; }; }