CreatureLib/src/Library/CreatureData/CreatureSpecies.cpp

38 lines
1.5 KiB
C++
Raw Normal View History

2019-10-06 11:50:52 +00:00
#include "CreatureSpecies.hpp"
2020-03-22 12:42:26 +00:00
#include <Arbutils/Assert.hpp>
2019-10-06 11:50:52 +00:00
using namespace CreatureLib::Library;
2020-05-26 16:31:06 +00:00
CreatureSpecies::CreatureSpecies(uint16_t id, const ArbUt::CaseInsensitiveConstString& name,
const SpeciesVariant* defaultVariant, float genderRatio,
const ArbUt::CaseInsensitiveConstString& growthRate, uint8_t captureRate)
2020-05-26 12:35:18 +00:00
: _name(name), _id(id), _genderRate(genderRatio), _growthRate(growthRate), _captureRate(captureRate), _variants(1) {
2020-03-22 12:42:26 +00:00
AssertNotNull(defaultVariant)
2020-05-26 12:35:18 +00:00
SetVariant("default"_cnc, defaultVariant);
2020-03-22 12:42:26 +00:00
}
2020-05-26 16:31:06 +00:00
bool CreatureSpecies::TryGetVariant(const ArbUt::CaseInsensitiveConstString& name,
ArbUt::BorrowedPtr<const SpeciesVariant>& out) const noexcept {
return TryGetVariant(name.GetHash(), out);
}
bool CreatureSpecies::TryGetVariant(uint32_t hash, ArbUt::BorrowedPtr<const SpeciesVariant>& out) const noexcept {
2020-05-26 12:35:18 +00:00
auto find = _variants.GetStdMap().find(hash);
if (find == _variants.end())
return false;
out = std::get<1>(*find);
return true;
}
2020-05-26 16:31:06 +00:00
void CreatureSpecies::SetVariant(const ArbUt::CaseInsensitiveConstString& name, const SpeciesVariant* variant) {
2020-05-26 12:35:18 +00:00
_variants.GetStdMap().insert({name, std::unique_ptr<const SpeciesVariant>(variant)});
}
2019-10-06 11:50:52 +00:00
2020-06-20 16:53:10 +00:00
Gender CreatureSpecies::GetRandomGender(ArbUt::Random& rand) const noexcept {
2020-06-10 10:16:09 +00:00
if (this->_genderRate == -1) {
return Gender::Genderless;
}
2019-10-06 11:50:52 +00:00
auto val = rand.GetDouble();
if (val >= this->_genderRate)
return Gender ::Female;
2019-10-06 11:50:52 +00:00
return Gender ::Male;
2020-05-04 18:40:45 +00:00
}