CreatureLib/src/Library/CreatureData/CreatureSpecies.hpp
Deukhoofd 27288563cd
All checks were successful
continuous-integration/drone/push Build is passing
Replace most collections with Arbutils collections for more safety.
2020-03-22 19:21:40 +01:00

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