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-02-27 17:23:23 +00:00
|
|
|
|
2020-05-26 16:31:06 +00:00
|
|
|
bool CreatureSpecies::TryGetVariant(const ArbUt::CaseInsensitiveConstString& name,
|
2020-06-20 16:50:55 +00:00
|
|
|
ArbUt::BorrowedPtr<const SpeciesVariant>& out) const noexcept {
|
2020-02-29 16:00:29 +00:00
|
|
|
return TryGetVariant(name.GetHash(), out);
|
|
|
|
}
|
2020-06-20 16:50:55 +00:00
|
|
|
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-02-13 16:16:07 +00:00
|
|
|
}
|
|
|
|
|
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)});
|
2020-02-13 16:16:07 +00:00
|
|
|
}
|
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();
|
2020-01-12 16:04:42 +00:00
|
|
|
if (val >= this->_genderRate)
|
2019-11-28 11:55:22 +00:00
|
|
|
return Gender ::Female;
|
2019-10-06 11:50:52 +00:00
|
|
|
return Gender ::Male;
|
2020-05-04 18:40:45 +00:00
|
|
|
}
|