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