70 lines
3.1 KiB
C++
70 lines
3.1 KiB
C++
#ifndef CREATURELIB_CREATURESPECIES_HPP
|
|
#define CREATURELIB_CREATURESPECIES_HPP
|
|
|
|
#include "../Gender.hpp"
|
|
#include "SpeciesVariant.hpp"
|
|
|
|
namespace CreatureLib::Library {
|
|
/*!
|
|
\brief This holds the data required for a species of a creature, so the general data we can describe different
|
|
creatures with.
|
|
*/
|
|
class CreatureSpecies {
|
|
const ArbUt::StringView _name;
|
|
uint16_t _id;
|
|
float _genderRate;
|
|
const ArbUt::StringView _growthRate;
|
|
uint8_t _captureRate;
|
|
|
|
ArbUt::Dictionary<uint32_t, std::unique_ptr<const SpeciesVariant>> _variantsLookup;
|
|
ArbUt::List<ArbUt::BorrowedPtr<const SpeciesVariant>> _variantsList;
|
|
std::unordered_set<uint32_t> _flags;
|
|
|
|
public:
|
|
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 = {});
|
|
|
|
virtual ~CreatureSpecies() noexcept { _variantsLookup.Clear(); }
|
|
|
|
inline uint16_t GetId() const noexcept { return _id; }
|
|
inline float GetGenderRate() const noexcept { return _genderRate; }
|
|
inline const ArbUt::StringView& GetGrowthRate() const noexcept { return _growthRate; }
|
|
inline uint8_t GetCaptureRate() const noexcept { return _captureRate; }
|
|
|
|
[[nodiscard]] inline bool HasVariant(const ArbUt::BasicStringView& key) const noexcept {
|
|
return _variantsLookup.Has(key);
|
|
}
|
|
[[nodiscard]] inline bool HasVariant(uint32_t hash) const noexcept { return _variantsLookup.Has(hash); }
|
|
[[nodiscard]] inline bool TryGetVariant(const ArbUt::BasicStringView& name,
|
|
ArbUt::BorrowedPtr<const SpeciesVariant>& out) const noexcept {
|
|
return TryGetVariant(name.GetHash(), out);
|
|
}
|
|
[[nodiscard]] bool TryGetVariant(uint32_t hash, ArbUt::BorrowedPtr<const SpeciesVariant>& out) const noexcept;
|
|
[[nodiscard]] inline ArbUt::BorrowedPtr<const SpeciesVariant>
|
|
GetVariant(const ArbUt::BasicStringView& key) const {
|
|
return _variantsLookup.Get(key);
|
|
}
|
|
[[nodiscard]] inline ArbUt::BorrowedPtr<const SpeciesVariant> GetVariant(uint32_t key) const {
|
|
return _variantsLookup.Get(key);
|
|
}
|
|
[[nodiscard]] Gender GetRandomGender(ArbUt::Random& rand) const noexcept;
|
|
[[nodiscard]] inline const ArbUt::StringView& GetName() const { return _name; }
|
|
|
|
void SetVariant(const ArbUt::StringView& name, const SpeciesVariant* variant);
|
|
|
|
inline const ArbUt::List<ArbUt::BorrowedPtr<const SpeciesVariant>>& GetVariantsIterator() const {
|
|
return _variantsList;
|
|
}
|
|
|
|
inline bool HasFlag(const ArbUt::StringView& key) const noexcept {
|
|
return this->_flags.find(key) != this->_flags.end();
|
|
}
|
|
inline bool HasFlag(uint32_t keyHash) const noexcept {
|
|
return this->_flags.find(keyHash) != this->_flags.end();
|
|
}
|
|
};
|
|
}
|
|
|
|
#endif // CREATURELIB_CREATURESPECIES_HPP
|