#ifndef CREATURELIB_LEARNABLEATTACKS_HPP #define CREATURELIB_LEARNABLEATTACKS_HPP #include #include #include #include #include #include "../Attacks/AttackData.hpp" namespace CreatureLib::Library { class LearnableAttacks { protected: ArbUt::Dictionary> _learnedByLevel; std::unordered_set _distinctLevelAttacks; public: explicit LearnableAttacks(size_t levelAttackCapacity) : _learnedByLevel(ArbUt::Dictionary>(levelAttackCapacity)) { for (auto kv : _learnedByLevel) { for (auto attack : kv.second) { AssertNotNull(attack) _distinctLevelAttacks.insert(attack); } } } virtual ~LearnableAttacks() = default; void AddLevelAttack(uint8_t level, const AttackData* attack); inline const ArbUt::List& GetAttacksForLevel(uint8_t level) const { return _learnedByLevel.Get(level); } inline const std::unordered_set& GetDistinctLevelAttacks() const noexcept { return _distinctLevelAttacks; } virtual const AttackData* GetRandomAttack(ArbUt::Random& rand) const { if (_distinctLevelAttacks.empty()) { return nullptr; } auto val = rand.Get(_distinctLevelAttacks.size()); auto it = _distinctLevelAttacks.begin(); std::advance(it, val); return *it; } }; } #endif // CREATURELIB_LEARNABLEATTACKS_HPP