+class OrderCompare {
+ public:
+ OrderCompare(BattleState *battle) : battle(battle) { }
+ bool operator ()(const BattleState::Order &lhs, const BattleState::Order &rhs) {
+ int lagl(lhs.isMonster ? battle->MonsterAt(lhs.index).Agility() : battle->HeroAt(lhs.index).Agility());
+ int ragl(rhs.isMonster ? battle->MonsterAt(rhs.index).Agility() : battle->HeroAt(rhs.index).Agility());
+ return lagl > ragl;
+ }
+ private:
+ BattleState *battle;
+};
+
+void BattleState::WriteOrder(std::vector<Order> &order) {
+ order.reserve(monsters.size() + NumHeroes());
+ for (int i(0); i < numHeroes; ++i) {
+ order.push_back(Order(i, false));
+ }
+ for (vector<Monster>::size_type i(0), end(monsters.size()); i < end; ++i) {
+ order.push_back(Order(i, true));
+ }
+ std::sort(order.begin(), order.end(), OrderCompare(this));
+}
+
+