int tagHeight(attackTypeMenu.Height());
int tagWidth(attackTypeMenu.Width() * 2 + attackTypeMenu.Width() / 2);
- int xOffset((BackgroundWidth() - 2 * tagWidth) / 2);
- heroTagPositions[0] = Point<int>(xOffset, BackgroundHeight() - 2 * tagHeight);
- heroTagPositions[1] = Point<int>(xOffset + tagWidth, BackgroundHeight() - 2 * tagHeight);
- heroTagPositions[2] = Point<int>(xOffset, BackgroundHeight() - tagHeight);
- heroTagPositions[3] = Point<int>(xOffset + tagWidth, BackgroundHeight() - tagHeight);
+ int xOffset((Width() - 2 * tagWidth) / 2);
+ heroTagPositions[0] = Point<int>(xOffset, Height() - 2 * tagHeight);
+ heroTagPositions[1] = Point<int>(xOffset + tagWidth, Height() - 2 * tagHeight);
+ heroTagPositions[2] = Point<int>(xOffset, Height() - tagHeight);
+ heroTagPositions[3] = Point<int>(xOffset + tagWidth, Height() - tagHeight);
tagHeight = res->normalFont->CharHeight() * 4 + res->smallHeroTagFrame->BorderHeight() * 2;
tagWidth = res->normalFont->CharWidth() * 6 + res->smallHeroTagFrame->BorderWidth() * 2;
- xOffset = (BackgroundWidth() - 4 * tagWidth) / 2;
- int yOffset(BackgroundHeight() - tagHeight);
+ xOffset = (Width() - 4 * tagWidth) / 2;
+ int yOffset(Height() - tagHeight);
smallHeroTagPositions[0] = Point<int>(xOffset, yOffset);
smallHeroTagPositions[1] = Point<int>(xOffset + 2 * tagWidth, yOffset);
smallHeroTagPositions[2] = Point<int>(xOffset + tagWidth, yOffset);
}
+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::RenderMonsters(SDL_Surface *screen, const Vector<int> &offset) {
for (vector<Monster>::size_type i(0), end(monsters.size()); i < end; ++i) {
- monsters[i].Sprite()->DrawCenterBottom(screen, monsterPositions[i] + offset);
+ monsters[i].Sprite()->DrawCenter(screen, monsterPositions[i] + offset);
}
}
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()->DrawCenter(screen, heroesPositions[i] + offset);
+ } else if (heroes[i].SpellAnimation() && heroes[i].SpellAnimation()->Running()) {
+ heroes[i].SpellAnimation()->DrawCenter(screen, heroesPositions[i] + offset);
} else {
int row(heroes[i].Health() > 0 ? 0 : 2);
- heroes[i].Sprite()->DrawCenterBottom(screen, heroesPositions[i] + offset, 1, row);
+ heroes[i].Sprite()->DrawCenter(screen, heroesPositions[i] + offset, 1, row);
}
}
}
SDL_Rect rect;
rect.x = offset.X();
- rect.y = offset.Y() + BackgroundHeight() - tagHeight;
- rect.w = BackgroundWidth();
+ rect.y = offset.Y() + Height() - tagHeight;
+ rect.w = Width();
rect.h = tagHeight;
SDL_FillRect(screen, &rect, SDL_MapRGB(screen->format, 0, 0, 0));
rect.y += res->normalFont->CharHeight() / 8;