1 package cz.cuni.amis.pogamut.ut2004.agent.module.sensor;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.Comparator;
6 import java.util.HashSet;
7 import java.util.List;
8 import java.util.Set;
9
10 import cz.cuni.amis.pogamut.base3d.worldview.object.ILocated;
11 import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.Weapon;
12 import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.Weaponry;
13 import cz.cuni.amis.pogamut.ut2004.bot.IUT2004BotController;
14 import cz.cuni.amis.pogamut.ut2004.bot.impl.UT2004Bot;
15 import cz.cuni.amis.pogamut.ut2004.communication.messages.ItemType;
16
17
18
19
20
21
22
23
24
25
26
27 public class WeaponPrefs {
28
29 protected List<WeaponPrefsRange> prefs = new ArrayList<WeaponPrefsRange>();
30 protected Weaponry weaponry;
31 protected UT2004Bot bot;
32 protected WeaponPrefsRange generalPrefs;
33 protected WeaponPrefs onlyGeneral;
34
35 public WeaponPrefs(Weaponry weaponry, UT2004Bot bot) {
36 this.weaponry = weaponry;
37 this.bot = bot;
38 this.generalPrefs = new WeaponPrefsRange(this, 0);
39 this.onlyGeneral = new WeaponPrefs(weaponry, bot, new WeaponPrefsRange(this, 0)) {
40 @Override
41 public WeaponPrefsRange newPrefsRange(double minDistance) {
42 throw new IllegalStateException("Can't invoke the method on 'generalOnly' preferences!");
43 }
44 @Override
45 public WeaponPrefs addGeneralPref(ItemType weapon, boolean usePrimaryMode) {
46 throw new IllegalStateException("Can't invoke the method on 'generalOnly' preferences!");
47 }
48 @Override
49 public WeaponPrefs addGeneralPref(Weapon weapon, boolean usePrimaryMode) {
50 throw new IllegalStateException("Can't invoke the method on 'generalOnly' preferences!");
51 }
52 };
53 }
54
55 protected WeaponPrefs(Weaponry weaponry, UT2004Bot bot, WeaponPrefsRange generalPrefs) {
56 this.weaponry = weaponry;
57 this.bot = bot;
58 this.generalPrefs = new WeaponPrefsRange(this, generalPrefs);
59 this.onlyGeneral = this;
60 }
61
62
63
64
65
66
67
68 public WeaponPrefs asGeneralOnly() {
69 return this.onlyGeneral;
70 }
71
72
73
74
75 public void clearAllPrefs() {
76 prefs.clear();
77 generalPrefs.clear();
78 onlyGeneral.generalPrefs.clear();
79 }
80
81
82
83
84
85
86 public WeaponPrefsRange getGeneralPrefs() {
87 return generalPrefs;
88 }
89
90
91
92
93
94
95
96
97 public WeaponPrefs addGeneralPref(ItemType weapon, boolean usePrimaryMode) {
98 generalPrefs.add(weapon, usePrimaryMode);
99 onlyGeneral.generalPrefs.add(weapon, usePrimaryMode);
100 return this;
101 }
102
103
104
105
106
107
108
109
110 public WeaponPrefs addGeneralPref(Weapon weapon, boolean usePrimaryMode) {
111 generalPrefs.add(weapon, usePrimaryMode);
112 onlyGeneral.generalPrefs.add(weapon, usePrimaryMode);
113 return this;
114 }
115
116
117
118
119
120
121
122
123 public WeaponPrefsRange newPrefsRange(double maxDistance) {
124 WeaponPrefsRange newPrefs = new WeaponPrefsRange(this, maxDistance);
125 this.prefs.add(newPrefs);
126 Collections.sort(this.prefs, new Comparator<WeaponPrefsRange>() {
127 @Override
128 public int compare(WeaponPrefsRange o1, WeaponPrefsRange o2) {
129 double diff = o1.getMaxDistance() - o2.getMaxDistance();
130 if (diff > 0) return 1;
131 if (diff < 0) return -1;
132 return 0;
133 }
134 });
135 return newPrefs;
136 }
137
138
139
140
141
142
143
144
145
146
147
148 public WeaponPrefsRange getWeaponPreferences(double distance) {
149 if (distance < 0) {
150 return generalPrefs;
151 }
152 if (prefs.size() == 0) return generalPrefs;
153 int i = 0;
154 for (WeaponPrefsRange pref : prefs) {
155 double minDistance = pref.getMinDistance();
156 if (minDistance > distance) {
157 if (i == 0) return null;
158 return prefs.get(i-1);
159 }
160 ++i;
161 }
162 return prefs.get(prefs.size()-1);
163 }
164
165
166
167
168
169
170 protected WeaponPrefsRange getPreviousRange(WeaponPrefsRange weaponPrefsRange) {
171 if (weaponPrefsRange == generalPrefs) return null;
172 int index = prefs.indexOf(weaponPrefsRange);
173 if (index < 1) return null;
174 return prefs.get(index-1);
175 }
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191 public WeaponPref getWeaponPreference(double distance, ItemType... forbiddenWeapons) {
192 WeaponPref pref = null;
193 if (distance >= 0 && prefs.size() != 0) {
194 WeaponPrefsRange range = getWeaponPreferences(distance);
195 pref = range.getWeaponPreference(forbiddenWeapons);
196 if (pref != null) {
197 return pref;
198 }
199 }
200 pref = generalPrefs.getWeaponPreference(forbiddenWeapons);
201 if (pref != null) return pref;
202 pref = generalPrefs.getWeaponPreference();
203 if (pref != null) return pref;
204 if (weaponry.getCurrentWeapon() != null) {
205 return new WeaponPref(weaponry.getCurrentWeapon().getType(), true);
206 }
207 return null;
208 }
209
210
211
212
213
214
215
216
217
218
219
220
221 public WeaponPref getWeaponPreference(ILocated target, ItemType... forbiddenWeapons) {
222 if (target == null) {
223 return getWeaponPreference(-1, forbiddenWeapons);
224 } else {
225 return getWeaponPreference(bot.getLocation().getDistance(target.getLocation()), forbiddenWeapons);
226 }
227 }
228
229
230
231
232
233
234 public WeaponPref getWeaponPreference(ItemType... forbiddenWeapons) {
235 return getWeaponPreference(-1, forbiddenWeapons);
236 }
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252 public WeaponPref getWeaponPreference(double distance, WeaponPref... forbiddenWeapons) {
253 WeaponPref pref = null;
254 if (distance >= 0 && prefs.size() != 0) {
255 WeaponPrefsRange range = getWeaponPreferences(distance);
256 pref = range.getWeaponPreference(forbiddenWeapons);
257 if (pref != null) {
258 return pref;
259 }
260 }
261 pref = generalPrefs.getWeaponPreference(forbiddenWeapons);
262 if (pref != null) return pref;
263 pref = generalPrefs.getWeaponPreference();
264 if (pref != null) return pref;
265 if (weaponry.getCurrentWeapon() != null) {
266 return new WeaponPref(weaponry.getCurrentWeapon().getType(), true);
267 }
268 return null;
269 }
270
271
272
273
274
275
276
277
278
279
280
281
282 public WeaponPref getWeaponPreference(ILocated target, WeaponPref... forbiddenWeapons) {
283 if (target == null) {
284 return getWeaponPreference(-1, forbiddenWeapons);
285 } else {
286 return getWeaponPreference(bot.getLocation().getDistance(target.getLocation()), forbiddenWeapons);
287 }
288 }
289
290
291
292
293
294
295 public WeaponPref getWeaponPreference(WeaponPref... forbiddenWeapons) {
296 return getWeaponPreference(-1, forbiddenWeapons);
297 }
298
299
300
301
302
303
304
305
306
307
308
309 public WeaponPref getWeaponPreference(double distance) {
310 return getWeaponPreference(distance, (ItemType[])null);
311 }
312
313
314
315
316
317
318
319
320
321
322
323 public WeaponPref getWeaponPreference(ILocated target) {
324 return getWeaponPreference(target, (ItemType[])null);
325 }
326
327
328
329
330
331 public WeaponPref getWeaponPreference() {
332 return getWeaponPreference(-1, (ItemType[])null);
333 }
334
335
336
337
338
339
340
341 public Set<WeaponPref> getPreferredWeapons() {
342 Set<WeaponPref> result = new HashSet<WeaponPref>();
343
344 result.addAll(generalPrefs.getPrefs());
345 for (WeaponPrefsRange range : prefs) {
346 result.addAll(range.getPrefs());
347 }
348
349 return result;
350 }
351
352 }