-/*
- * TargetSelection.cpp
- *
- * Created on: Aug 9, 2012
- * Author: holy
- */
-
#include "TargetSelection.h"
-#include "BattleState.h"
+#include "Battle.h"
+#include "../common/TargetingMode.h"
+
+#include <cassert>
+
namespace battle {
-TargetSelection::TargetSelection(BattleState *battle, bool multiple, bool atEnemy)
+TargetSelection::TargetSelection()
+: battle(0)
+, selected()
+, selection(-1)
+, cursor(0)
+, multiple(false)
+, enemy(true) {
+
+}
+
+TargetSelection::TargetSelection(Battle *battle, bool multiple, bool atEnemy)
: battle(battle)
-, selected(battle ? (battle->MonsterPositions().size() > battle->Heroes().size() ? battle->MonsterPositions().size() : battle->Heroes().size()) : 0, false)
+, selected(battle->MaxMonsters() > battle->NumHeroes() ? battle->MaxMonsters() : battle->NumHeroes(), State())
, selection(-1)
, cursor(0)
, multiple(multiple)
, enemy(atEnemy) {
- if (battle && enemy) {
+ if (enemy) {
FindNextEnemy();
}
}
-void TargetSelection::SelectEnemies() {
- if (TargetsEnemies()) return;
+
+void TargetSelection::ReadMode(const common::TargetingMode &tm) {
+ if (tm.TargetsEnemy()) {
+ SelectMonsters();
+ } else {
+ SelectHeroes();
+ }
+ if (tm.TargetsSingle()) {
+ SelectSingle();
+ } else if (tm.TargetsMultiple()) {
+ SelectMultiple();
+ }
+}
+
+
+void TargetSelection::SelectMonsters() {
+ if (TargetsMonsters()) return;
enemy = true;
UnselectAll();
cursor = 0;
void TargetSelection::Reset() {
UnselectAll();
cursor = 0;
- if (TargetsEnemies()) {
+ if (TargetsMonsters()) {
FindNextEnemy();
}
}
void TargetSelection::MoveUp() {
- if (TargetsEnemies()) return;
+ if (TargetsMonsters()) return;
if (cursor < 2) {
- SelectEnemies();
+ SelectMonsters();
} else {
cursor -= 2;
}
}
void TargetSelection::MoveRight() {
- if (TargetsEnemies()) {
- cursor = (cursor + 1) % battle->MonsterPositions().size();
+ assert(battle);
+ if (TargetsMonsters()) {
+ cursor = (cursor + 1) % battle->MaxMonsters();
while (!battle->MonsterPositionOccupied(cursor)) {
- cursor = (cursor + 1) % battle->MonsterPositions().size();
+ cursor = (cursor + 1) % battle->MaxMonsters();
}
} else {
- cursor = (cursor + 1) % battle->Heroes().size();
+ cursor = (cursor + 1) % battle->NumHeroes();
}
}
void TargetSelection::MoveDown() {
- if (TargetsEnemies()) {
+ assert(battle);
+ if (TargetsMonsters()) {
SelectHeroes();
return;
}
- int newCursor(cursor + 2 % 4);
- if (newCursor < int(battle->Heroes().size())) {
+ int newCursor((cursor + 2) % 4);
+ if (newCursor < battle->NumHeroes()) {
cursor = newCursor;
}
}
void TargetSelection::MoveLeft() {
- if (TargetsEnemies()) {
- cursor = (cursor + battle->MonsterPositions().size() - 1) % battle->MonsterPositions().size();
+ assert(battle);
+ if (TargetsMonsters()) {
+ cursor = (cursor + battle->MaxMonsters() - 1) % battle->MaxMonsters();
FindNextEnemy();
} else {
- cursor = (cursor + battle->Heroes().size() - 1) % battle->Heroes().size();
+ cursor = (cursor + battle->NumHeroes() - 1) % battle->NumHeroes();
}
}
void TargetSelection::FindNextEnemy() {
+ assert(battle);
+ int start(cursor);
while (!battle->MonsterPositionOccupied(cursor)) {
- cursor = (cursor + battle->MonsterPositions().size() - 1) % battle->MonsterPositions().size();
+ cursor = (cursor + battle->MaxMonsters() - 1) % battle->MaxMonsters();
+ if (cursor == start) break;
}
}