33 lines
1.2 KiB
C++
33 lines
1.2 KiB
C++
#include "CreatureSpecies.hpp"
|
|
#include <Arbutils/Assert.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)
|
|
: _name(name), _id(id), _genderRate(genderRatio), _growthRate(growthRate), _captureRate(captureRate), _variants(1) {
|
|
AssertNotNull(defaultVariant)
|
|
SetVariant("default"_cnc, defaultVariant);
|
|
}
|
|
|
|
bool CreatureSpecies::TryGetVariant(uint32_t hash, ArbUt::BorrowedPtr<const SpeciesVariant>& out) const noexcept {
|
|
auto find = _variants.GetStdMap().find(hash);
|
|
if (find == _variants.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<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;
|
|
} |