diff --git a/CInterface/Library/CreatureSpecies.cpp b/CInterface/Library/CreatureSpecies.cpp index b11ac76..af58937 100644 --- a/CInterface/Library/CreatureSpecies.cpp +++ b/CInterface/Library/CreatureSpecies.cpp @@ -54,4 +54,8 @@ export uint8_t CreatureLib_CreatureSpecies_SetVariant(CreatureSpecies* p, const export Gender CreatureLib_CreatureSpecies_GetRandomGender(CreatureSpecies* p, ArbUt::Random* random) { return p->GetRandomGender(*random); +} + +export const SpeciesVariant* const* CreatureLib_CreatureSpecies_GetVariants(CreatureSpecies* p) { + return reinterpret_cast(p->GetVariantsIterator().RawData()); } \ No newline at end of file diff --git a/src/Library/CreatureData/CreatureSpecies.cpp b/src/Library/CreatureData/CreatureSpecies.cpp index dfdec36..98851e3 100644 --- a/src/Library/CreatureData/CreatureSpecies.cpp +++ b/src/Library/CreatureData/CreatureSpecies.cpp @@ -5,21 +5,23 @@ using namespace CreatureLib::Library; CreatureSpecies::CreatureSpecies(uint16_t id, const ArbUt::StringView& name, const SpeciesVariant* defaultVariant, float genderRatio, const ArbUt::StringView& growthRate, uint8_t captureRate) - : _name(name), _id(id), _genderRate(genderRatio), _growthRate(growthRate), _captureRate(captureRate), _variants(1) { + : _name(name), _id(id), _genderRate(genderRatio), _growthRate(growthRate), _captureRate(captureRate), + _variantsLookup(1), _variantsList(1) { AssertNotNull(defaultVariant) SetVariant("default"_cnc, defaultVariant); } bool CreatureSpecies::TryGetVariant(uint32_t hash, ArbUt::BorrowedPtr& out) const noexcept { - auto find = _variants.GetStdMap().find(hash); - if (find == _variants.end()) + auto find = _variantsLookup.GetStdMap().find(hash); + if (find == _variantsLookup.end()) return false; out = std::get<1>(*find); return true; } void CreatureSpecies::SetVariant(const ArbUt::StringView& name, const SpeciesVariant* variant) { - _variants.GetStdMap().insert({name, std::unique_ptr(variant)}); + _variantsLookup.GetStdMap().insert({name, std::unique_ptr(variant)}); + _variantsList.Append(variant); } Gender CreatureSpecies::GetRandomGender(ArbUt::Random& rand) const noexcept { diff --git a/src/Library/CreatureData/CreatureSpecies.hpp b/src/Library/CreatureData/CreatureSpecies.hpp index 5108d8f..33f6d34 100644 --- a/src/Library/CreatureData/CreatureSpecies.hpp +++ b/src/Library/CreatureData/CreatureSpecies.hpp @@ -21,13 +21,15 @@ namespace CreatureLib::Library { float _genderRate; const ArbUt::StringView _growthRate; uint8_t _captureRate; - ArbUt::Dictionary> _variants; + + ArbUt::Dictionary> _variantsLookup; + ArbUt::List> _variantsList; public: CreatureSpecies(uint16_t id, const ArbUt::StringView& name, const SpeciesVariant* defaultVariant, float genderRatio, const ArbUt::StringView& growthRate, uint8_t captureRate); - virtual ~CreatureSpecies() noexcept { _variants.Clear(); } + virtual ~CreatureSpecies() noexcept { _variantsLookup.Clear(); } inline uint16_t GetId() const noexcept { return _id; } inline float GetGenderRate() const noexcept { return _genderRate; } @@ -35,9 +37,9 @@ namespace CreatureLib::Library { inline uint8_t GetCaptureRate() const noexcept { return _captureRate; } [[nodiscard]] inline bool HasVariant(const ArbUt::BasicStringView& key) const noexcept { - return _variants.Has(key); + return _variantsLookup.Has(key); } - [[nodiscard]] inline bool HasVariant(uint32_t hash) const noexcept { return _variants.Has(hash); } + [[nodiscard]] inline bool HasVariant(uint32_t hash) const noexcept { return _variantsLookup.Has(hash); } [[nodiscard]] inline bool TryGetVariant(const ArbUt::BasicStringView& name, ArbUt::BorrowedPtr& out) const noexcept { return TryGetVariant(name.GetHash(), out); @@ -45,18 +47,18 @@ namespace CreatureLib::Library { [[nodiscard]] bool TryGetVariant(uint32_t hash, ArbUt::BorrowedPtr& out) const noexcept; [[nodiscard]] inline ArbUt::BorrowedPtr GetVariant(const ArbUt::BasicStringView& key) const { - return _variants.Get(key); + return _variantsLookup.Get(key); } [[nodiscard]] inline ArbUt::BorrowedPtr GetVariant(uint32_t key) const { - return _variants.Get(key); + return _variantsLookup.Get(key); } [[nodiscard]] Gender GetRandomGender(ArbUt::Random& rand) const noexcept; [[nodiscard]] inline const ArbUt::StringView& GetName() const { return _name; } void SetVariant(const ArbUt::StringView& name, const SpeciesVariant* variant); - inline const ArbUt::Dictionary>& GetVariantsIterator() const { - return _variants; + inline const ArbUt::List>& GetVariantsIterator() const { + return _variantsList; } }; }