#include "TurnOrdering.hpp" #include "../Models/Battle.hpp" #include "../TurnChoices/AttackTurnChoice.hpp" using namespace CreatureLib; using namespace Battling; class ChoiceCompare { public: 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 aAttack = std::dynamic_pointer_cast(a); auto bAttack = std::dynamic_pointer_cast(b); EnsureNotNull(aAttack); EnsureNotNull(bAttack); auto aPriority = aAttack->GetPriority(); auto bPriority = bAttack->GetPriority(); if (aPriority != bPriority) return aPriority > bPriority; } if (a->__GetSpeed() != b->__GetSpeed()) return a->__GetSpeed() > b->__GetSpeed(); return a->__GetRandomValue() > b->__GetRandomValue(); } }; void TurnOrdering::OrderChoices(std::vector>& vec) { for (const auto& item : vec) { EnsureNotNull(item); if (item->GetKind() == TurnChoiceKind::Attack) { auto attackChoice = std::dynamic_pointer_cast(item); EnsureNotNull(attackChoice); auto priority = attackChoice->GetPriority(); HOOK(ChangePriority, attackChoice, attackChoice.get(), &priority); attackChoice->SetPriority(priority); } auto speed = item->GetUser()->GetBoostedStat(); HOOK(ChangeSpeed, item, item.get(), &speed); item->__SetSpeed(speed); } std::sort(vec.begin(), vec.end(), ChoiceCompare()); }