namespace battle {
-void SelectTarget::OnEnterState(SDL_Surface *screen) {
+SelectTarget::SelectTarget(
+ Battle *battle,
+ SelectAttackType *parent,
+ TargetSelection *selection,
+ const graphics::Sprite *cursorIcon)
+: battle(battle)
+, parent(parent)
+, selection(selection)
+, cursorIcon(cursorIcon)
+, flipFlop(true) {
}
+
+void SelectTarget::OnEnterState(SDL_Surface *screen) {
+ OnResize(screen->w, screen->h);
+}
+
void SelectTarget::OnExitState(SDL_Surface *screen) {
}
void SelectTarget::OnResize(int width, int height) {
+ Vector<int> offset(parent->ScreenOffset());
+ cursorOffset = Vector<int>(cursorIcon->Width() / -2, cursorIcon->Height()) + offset;
+ // offset the indicator by 1/8th to the right and top
+ indicatorOffset = cursorOffset + Vector<int>(cursorIcon->Width() / 8, cursorIcon->Height() / -8);
+
+ monsterPositions.clear();
+ monsterPositions.reserve(battle->NumMonsters());
+ for (int i(0), end(battle->NumMonsters()); i < end; ++i) {
+ monsterPositions.push_back(battle->MonsterAt(i).Position());
+ }
+ heroPositions.clear();
+ heroPositions.reserve(battle->NumHeroes());
+ for (int i(0), end(battle->NumHeroes()); i < end; ++i) {
+ heroPositions.push_back(parent->HeroTagPositionAt(i) + parent->HeroTagAt(i).HeroOffset());
+ }
}
}
void SelectTarget::Render(SDL_Surface *screen) {
- Vector<int> offset(battle->CalculateScreenOffset(screen));
parent->Render(screen);
- RenderCursors(screen, offset);
+ RenderCursors(screen);
}
-void SelectTarget::RenderCursors(SDL_Surface *screen, const math::Vector<int> &offset) {
- Vector<int> cursorOffset(cursorIcon->Width() / -2, cursorIcon->Height());
- // offset the indicator by 1/8th to the right and top
- Vector<int> indicatorOffset(cursorOffset + Vector<int>(cursorIcon->Width() / 8, cursorIcon->Height() / -8));
- vector<Vector<int> > positions;
- if (selection->TargetsMonsters()) {
- for (int i(0), end(battle->MaxMonsters()); i < end; ++i) {
- positions.push_back(battle->MonsterAt(i).Position());
- }
- } else {
- for (int i(0), end(battle->NumHeroes()); i < end; ++i) {
- positions.push_back(battle->HeroTagPositionAt(i) + battle->HeroTagAt(i).HeroOffset());
- }
- }
+void SelectTarget::RenderCursors(SDL_Surface *screen) {
+ vector<Vector<int> > &positions = selection->TargetsMonsters()
+ ? monsterPositions
+ : heroPositions;
+
if (flipFlop) {
- for (vector<Vector<int> >::size_type i(0); i < positions.size(); ++i) {
+ for (vector<Vector<int> >::size_type i(0), end(positions.size());
+ i != end; ++i) {
if (selection->IsSelected(i)) {
- cursorIcon->DrawTopRight(screen, positions[i] + indicatorOffset + offset);
+ cursorIcon->DrawTopRight(screen, positions[i] + indicatorOffset);
}
}
}
flipFlop = !flipFlop;
- cursorIcon->DrawTopRight(screen, positions[selection->Current()] + offset + cursorOffset);
+ cursorIcon->DrawTopRight(screen, positions[selection->Current()] + cursorOffset);
}
}