#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 _distinctAttacks; public: explicit LearnableAttacks(size_t levelAttackCapacity) : _learnedByLevel(ArbUt::Dictionary>(levelAttackCapacity)) { for (auto kv : _learnedByLevel) { for (auto attack : kv.second) { AssertNotNull(attack) _distinctAttacks.insert(attack); } } } virtual ~LearnableAttacks() = default; void AddLevelAttack(uint8_t level, const AttackData* attack); const ArbUt::List& GetAttacksForLevel(uint8_t level) const; virtual const AttackData* GetRandomAttack(ArbUt::Random& rand) const { if (_distinctAttacks.empty()) { return nullptr; } auto val = rand.Get(_distinctAttacks.size()); auto it = _distinctAttacks.begin(); std::advance(it, val); return *it; } }; } #endif // CREATURELIB_LEARNABLEATTACKS_HPP