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