}
+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));
+}
+
+
void BattleState::HandleEvents(const Input &input) {
}
void BattleState::RenderHeroes(SDL_Surface *screen, const Vector<int> &offset) {
for (int i(0); i < numHeroes; ++i) {
- if (HeroAnimationAt(i).Running()) {
- HeroAnimationAt(i).DrawCenterBottom(screen, heroesPositions[i] + offset);
+ if (heroes[i].AttackAnimation() && heroes[i].AttackAnimation()->Running()) {
+ heroes[i].AttackAnimation()->DrawCenterBottom(screen, heroesPositions[i] + offset);
+ } else if (heroes[i].SpellAnimation() && heroes[i].SpellAnimation()->Running()) {
+ heroes[i].SpellAnimation()->DrawCenterBottom(screen, heroesPositions[i] + offset);
} else {
int row(heroes[i].Health() > 0 ? 0 : 2);
heroes[i].Sprite()->DrawCenterBottom(screen, heroesPositions[i] + offset, 1, row);