]> git.localhorst.tv Git - l2e.git/blob - src/battle/TargetSelection.cpp
added entity orientation awareness
[l2e.git] / src / battle / TargetSelection.cpp
1 /*
2  * TargetSelection.cpp
3  *
4  *  Created on: Aug 9, 2012
5  *      Author: holy
6  */
7
8 #include "TargetSelection.h"
9
10 #include "BattleState.h"
11 #include "../common/TargetingMode.h"
12
13 namespace battle {
14
15 TargetSelection::TargetSelection(BattleState *battle, bool multiple, bool atEnemy)
16 : battle(battle)
17 , selected(battle ? (battle->MaxMonsters() > battle->NumHeroes() ? battle->MaxMonsters() : battle->NumHeroes()) : 0, State())
18 , selection(-1)
19 , cursor(0)
20 , multiple(multiple)
21 , enemy(atEnemy) {
22         if (battle && enemy) {
23                 FindNextEnemy();
24         }
25 }
26
27
28 void TargetSelection::ReadMode(const common::TargetingMode &tm) {
29         if (tm.TargetsEnemy()) {
30                 SelectMonsters();
31         } else {
32                 SelectHeroes();
33         }
34         if (tm.TargetsSingle()) {
35                 SelectSingle();
36         } else if (tm.TargetsMultiple()) {
37                 SelectMultiple();
38         }
39 }
40
41
42 void TargetSelection::SelectMonsters() {
43         if (TargetsMonsters()) return;
44         enemy = true;
45         UnselectAll();
46         cursor = 0;
47         FindNextEnemy();
48 }
49
50 void TargetSelection::SelectHeroes() {
51         if (TargetsHeroes()) return;
52         enemy = false;
53         UnselectAll();
54         cursor = 0;
55 }
56
57
58 void TargetSelection::Reset() {
59         UnselectAll();
60         cursor = 0;
61         if (TargetsMonsters()) {
62                 FindNextEnemy();
63         }
64 }
65
66
67 void TargetSelection::MoveUp() {
68         if (TargetsMonsters()) return;
69         if (cursor < 2) {
70                 SelectMonsters();
71         } else {
72                 cursor -= 2;
73         }
74 }
75
76 void TargetSelection::MoveRight() {
77         if (TargetsMonsters()) {
78                 cursor = (cursor + 1) % battle->MaxMonsters();
79                 while (!battle->MonsterPositionOccupied(cursor)) {
80                         cursor = (cursor + 1) % battle->MaxMonsters();
81                 }
82         } else {
83                 cursor = (cursor + 1) % battle->NumHeroes();
84         }
85 }
86
87 void TargetSelection::MoveDown() {
88         if (TargetsMonsters()) {
89                 SelectHeroes();
90                 return;
91         }
92         int newCursor((cursor + 2) % 4);
93         if (newCursor < battle->NumHeroes()) {
94                 cursor = newCursor;
95         }
96 }
97
98 void TargetSelection::MoveLeft() {
99         if (TargetsMonsters()) {
100                 cursor = (cursor + battle->MaxMonsters() - 1) % battle->MaxMonsters();
101                 FindNextEnemy();
102         } else {
103                 cursor = (cursor + battle->NumHeroes() - 1) % battle->NumHeroes();
104         }
105 }
106
107 void TargetSelection::FindNextEnemy() {
108         int start(cursor);
109         while (!battle->MonsterPositionOccupied(cursor)) {
110                 cursor = (cursor + battle->MaxMonsters() - 1) % battle->MaxMonsters();
111                 if (cursor == start) break;
112         }
113 }
114
115 }