37 lines
1.4 KiB
C++
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;
|
|
} |