#ifndef PKMNLIB_POKEMONSPECIES_HPP #define PKMNLIB_POKEMONSPECIES_HPP #include #include "../Evolutions/EvolutionData.hpp" #include "PokemonForme.hpp" namespace PkmnLib::Library { class PokemonSpecies final : public CreatureLib::Library::CreatureSpecies { private: u8 _baseHappiness; ArbUt::UniquePtrList _evolutions; ArbUt::List _eggGroups; public: PokemonSpecies(u16 id, const ArbUt::StringView& name, const PokemonForme* non_null defaultForme, float genderRatio, const ArbUt::StringView& growthRate, u8 captureRate, u8 baseHappiness, const ArbUt::List& eggGroups, std::unordered_set flags = {}) noexcept : CreatureSpecies(id, name, defaultForme, genderRatio, growthRate, captureRate, flags), _baseHappiness(baseHappiness), _eggGroups(eggGroups) {} ~PokemonSpecies() override = default; inline u8 GetBaseHappiness() const { return _baseHappiness; } inline ArbUt::BorrowedPtr GetDefaultForme() const { return CreatureSpecies::GetVariant("default"_cnc.GetHash()).As(); } inline bool HasForme(const ArbUt::BasicStringView& key) const { return HasVariant(key); } inline std::optional> TryGetForme(const ArbUt::BasicStringView& key) const { auto res = TryGetVariant(key); if (!res.has_value()) return {}; return res.value().As(); } inline ArbUt::BorrowedPtr GetForme(const ArbUt::BasicStringView& key) const { return CreatureSpecies::GetVariant(key).As(); } inline void AddEvolution(const EvolutionData* non_null data) noexcept { _evolutions.Append(data); } const ArbUt::UniquePtrList& GetEvolutions() const noexcept { return _evolutions; } bool HasEggGroup(const ArbUt::StringView& sv) const noexcept { return _eggGroups.Contains(sv); } const ArbUt::List& GetEggGroups() const noexcept { return _eggGroups; } }; } #endif // PKMNLIB_POKEMONSPECIES_HPP