59 lines
2.3 KiB
C++
59 lines
2.3 KiB
C++
#ifndef CREATURELIB_CREATURESPECIES_HPP
|
|
#define CREATURELIB_CREATURESPECIES_HPP
|
|
|
|
#include <Arbutils/Collections/Dictionary.hpp>
|
|
#include <Arbutils/ConstString.hpp>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include "../Gender.hpp"
|
|
#include "SpeciesVariant.hpp"
|
|
|
|
using ConstString = Arbutils::CaseInsensitiveConstString;
|
|
|
|
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 ConstString _name;
|
|
uint16_t _id;
|
|
float _genderRate;
|
|
const ConstString _growthRate;
|
|
uint8_t _captureRate;
|
|
Arbutils::Collections::Dictionary<uint32_t, const SpeciesVariant*> _variants;
|
|
|
|
public:
|
|
CreatureSpecies(uint16_t id, const ConstString& name, const SpeciesVariant* defaultVariant, float genderRatio,
|
|
const ConstString& growthRate, uint8_t captureRate);
|
|
|
|
virtual ~CreatureSpecies() {
|
|
for (auto v : _variants)
|
|
delete v.second;
|
|
_variants.Clear();
|
|
}
|
|
|
|
inline uint16_t GetId() const { return _id; }
|
|
inline float GetGenderRate() const { return _genderRate; }
|
|
inline const ConstString& GetGrowthRate() const { return _growthRate; }
|
|
inline uint8_t GetCaptureRate() const { return _captureRate; }
|
|
|
|
[[nodiscard]] bool HasVariant(const ConstString& key) const;
|
|
[[nodiscard]] bool HasVariant(uint32_t hash) const;
|
|
[[nodiscard]] bool TryGetVariant(const ConstString& name, const SpeciesVariant*& out) const;
|
|
[[nodiscard]] bool TryGetVariant(uint32_t hash, const SpeciesVariant*& out) const;
|
|
[[nodiscard]] const SpeciesVariant* GetVariant(const ConstString& key) const;
|
|
[[nodiscard]] const SpeciesVariant* GetVariant(uint32_t key) const;
|
|
[[nodiscard]] Gender GetRandomGender(Arbutils::Random& rand) const;
|
|
[[nodiscard]] const ConstString& GetName() const { return _name; }
|
|
|
|
void SetVariant(const ConstString& name, const SpeciesVariant* variant);
|
|
|
|
const Arbutils::Collections::Dictionary<uint32_t, const SpeciesVariant*>& GetVariantsIterator() const {
|
|
return _variants;
|
|
}
|
|
};
|
|
}
|
|
|
|
#endif // CREATURELIB_CREATURESPECIES_HPP
|