CreatureLib/src/Library/CreatureData/CreatureSpecies.cpp

37 lines
1.4 KiB
C++

#include "CreatureSpecies.hpp"
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,
std::unordered_set<uint32_t> flags)
: _name(name), _id(id), _genderRate(genderRatio), _growthRate(growthRate), _captureRate(captureRate),
_variantsLookup(1), _variantsList(1), _flags(std::move(flags)) {
AssertNotNull(defaultVariant)
SetVariant("default"_cnc, defaultVariant);
}
bool CreatureSpecies::TryGetVariant(uint32_t hash, ArbUt::BorrowedPtr<const SpeciesVariant>& out) const noexcept {
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) {
Assert(!name.IsEmpty())
AssertNotNull(variant)
_variantsList.CreateBack(variant);
_variantsLookup.GetStdMap().insert({name, std::unique_ptr<const SpeciesVariant>(variant)});
}
Gender CreatureSpecies::GetRandomGender(ArbUt::Random& rand) const noexcept {
if (this->_genderRate == -1) {
return Gender::Genderless;
}
auto val = rand.GetDouble();
if (val >= this->_genderRate)
return Gender ::Female;
return Gender ::Male;
}