#include "TurnOrdering.hpp" #include #include "../Models/Battle.hpp" #include "../TurnChoices/AttackTurnChoice.hpp" using namespace CreatureLib; using namespace Battling; class ChoiceCompare { public: explicit ChoiceCompare() {} bool operator()(const std::shared_ptr& a, const std::shared_ptr& b) { auto aKind = a->GetKind(); auto bKind = b->GetKind(); if (aKind != bKind) return aKind > bKind; if (aKind == TurnChoiceKind::Attack) { auto aPriority = dynamic_cast(a.get())->GetPriority(); auto bPriority = dynamic_cast(b.get())->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; return a->__GetRandomValue() > b->__GetRandomValue(); } }; void TurnOrdering::OrderChoices(std::vector>& vec, [[maybe_unused]] ArbUt::Random& rand) { for (auto item : vec) { if (item->GetKind() == TurnChoiceKind::Attack) { auto attackChoice = static_cast(item.get()); auto priority = attackChoice->GetPriority(); HOOK(ChangePriority, attackChoice, attackChoice, &priority); attackChoice->SetPriority(priority); } } std::sort(vec.begin(), vec.end(), ChoiceCompare()); }