#ifndef CREATURELIB_CREATURESPECIES_HPP #define CREATURELIB_CREATURESPECIES_HPP #include #include #include #include #include "../Gender.hpp" #include "SpeciesVariant.hpp" using ConstString = Arbutils::CaseInsensitiveConstString; namespace CreatureLib::Library { /*! \brief This holds the data required for a species of a creature, so the general data we can describe different creatures with. */ class CreatureSpecies { const ConstString _name; uint16_t _id; float _genderRate; const ConstString _growthRate; uint8_t _captureRate; Arbutils::Collections::Dictionary _variants; public: CreatureSpecies(uint16_t id, const ConstString& name, const SpeciesVariant* defaultVariant, float genderRatio, const ConstString& growthRate, uint8_t captureRate); virtual ~CreatureSpecies() { for (auto v : _variants) delete v.second; _variants.Clear(); } inline uint16_t GetId() const { return _id; } inline float GetGenderRate() const { return _genderRate; } inline const ConstString& GetGrowthRate() const { return _growthRate; } inline uint8_t GetCaptureRate() const { return _captureRate; } [[nodiscard]] bool HasVariant(const ConstString& key) const; [[nodiscard]] bool HasVariant(uint32_t hash) const; [[nodiscard]] bool TryGetVariant(const ConstString& name, const SpeciesVariant*& out) const; [[nodiscard]] bool TryGetVariant(uint32_t hash, const SpeciesVariant*& out) const; [[nodiscard]] const SpeciesVariant* GetVariant(const ConstString& key) const; [[nodiscard]] const SpeciesVariant* GetVariant(uint32_t key) const; [[nodiscard]] Gender GetRandomGender(Arbutils::Random& rand) const; [[nodiscard]] const ConstString& GetName() const { return _name; } void SetVariant(const ConstString& name, const SpeciesVariant* variant); const Arbutils::Collections::Dictionary& GetVariantsIterator() const { return _variants; } }; } #endif // CREATURELIB_CREATURESPECIES_HPP