#include "TurnOrdering.hpp" #include #include "../Models/Battle.hpp" #include "../TurnChoices/AttackTurnChoice.hpp" using namespace CreatureLib; using namespace Battling; class ChoiceCompare { Arbutils::Random& _rand; public: explicit ChoiceCompare(Arbutils::Random& rand) : _rand(rand) {} bool operator()(const BaseTurnChoice* a, const BaseTurnChoice* b) { auto aKind = a->GetKind(); auto bKind = b->GetKind(); if (aKind != bKind) return aKind > bKind; if (aKind == TurnChoiceKind::Attack) { auto aPriority = dynamic_cast(a)->GetPriority(); auto bPriority = dynamic_cast(b)->GetPriority(); if (aPriority != bPriority) return aPriority > bPriority; } auto aSpeed = a->GetUser()->GetBoostedStat(Library::Statistic::Speed); auto bSpeed = b->GetUser()->GetBoostedStat(Library::Statistic::Speed); if (aSpeed != bSpeed) return aSpeed > bSpeed; auto randomValue = _rand.Get(2); return randomValue == 0; } }; void TurnOrdering::OrderChoices(std::vector& vec, Arbutils::Random& rand) { std::sort(vec.begin(), vec.end(), ChoiceCompare(rand)); }