1 package cz.cuni.amis.pogamut.ut2004.tournament.deathmatch;
2
3 import java.io.File;
4 import java.util.concurrent.Callable;
5 import java.util.concurrent.ThreadPoolExecutor;
6 import java.util.logging.Level;
7
8 import org.apache.commons.io.FileUtils;
9
10 import cz.cuni.amis.pogamut.base.utils.logging.LogCategory;
11 import cz.cuni.amis.pogamut.ut2004.tournament.botexecution.UT2004BotExecutionConfig;
12 import cz.cuni.amis.pogamut.ut2004.tournament.match.UT2004BotConfig;
13 import cz.cuni.amis.pogamut.ut2004.utils.UCCWrapper;
14 import cz.cuni.amis.pogamut.ut2004.utils.UCCWrapper.UCCWrapperConf;
15 import cz.cuni.amis.utils.ExceptionToString;
16 import cz.cuni.amis.utils.exception.PogamutException;
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 public class UT2004DeathMatch1v1 implements Callable<UT2004DeathMatchResult>, Runnable {
34
35
36
37
38 private int fragLimit;
39
40
41
42
43 private int timeLimitInMinutes;
44
45
46
47
48
49
50 private String matchName;
51
52
53
54
55
56
57 private String bot1Name;
58
59
60
61
62
63
64 private String bot1JarPath;
65
66
67
68
69
70
71 private String bot2Name;
72
73
74
75
76
77
78 private String bot2JarPath;
79
80
81
82
83
84
85 private String unrealHome;
86
87
88
89
90
91
92 private String mapName;
93
94
95
96
97
98
99 private String outputDir;
100
101
102
103
104 private LogCategory log;
105
106
107
108
109 private UT2004DeathMatchResult result = null;
110
111 private Throwable exception;
112
113
114
115
116 public UT2004DeathMatch1v1() {
117 log = new LogCategory(getMatchName());
118 }
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134 public UT2004DeathMatch1v1(String unrealHome, String mapName, String bot1Name, String bot1JarPath, String bot2Name, String bot2JarPath) {
135 this.unrealHome = unrealHome;
136 this.mapName = mapName;
137 this.bot1Name = bot1Name;
138 this.bot1JarPath = bot1JarPath;
139 this.bot2Name = bot2Name;
140 this.bot2JarPath = bot2JarPath;
141 this.matchName = bot1Name + "-vs-" + bot2Name;
142 this.outputDir = "results" + File.separator + "matches";
143 this.fragLimit = 20;
144 this.timeLimitInMinutes = 20;
145 log = new LogCategory(getMatchName());
146 }
147
148
149
150
151
152
153
154 public LogCategory getLog() {
155 return log;
156 }
157
158
159
160
161
162
163 public int getFragLimit() {
164 return fragLimit;
165 }
166
167
168
169
170
171
172 public int getTimeLimitInMinutes() {
173 return timeLimitInMinutes;
174 }
175
176
177
178
179
180
181 public String getMatchName() {
182 return matchName;
183 }
184
185
186
187
188
189
190 public String getBot1Name() {
191 return bot1Name;
192 }
193
194
195
196
197
198
199 public String getBot1JarPath() {
200 return bot1JarPath;
201 }
202
203
204
205
206
207
208 public String getBot2Name() {
209 return bot2Name;
210 }
211
212
213
214
215
216
217 public String getBot2JarPath() {
218 return bot2JarPath;
219 }
220
221
222
223
224
225
226 public String getUnrealHome() {
227 return unrealHome;
228 }
229
230
231
232
233
234 public String getMapName() {
235 return mapName;
236 }
237
238
239
240
241
242
243 public String getOutputDir() {
244 return outputDir;
245 }
246
247
248
249
250
251
252 public UT2004DeathMatchResult getResult() {
253 return result;
254 }
255
256
257
258
259
260 public Throwable getException() {
261 return exception;
262 }
263
264
265
266
267
268 public void setLog(LogCategory log) {
269 this.log = log;
270 }
271
272 public UT2004DeathMatch1v1 setFragLimit(int fragLimit) {
273 this.fragLimit = fragLimit;
274 return this;
275 }
276
277 public UT2004DeathMatch1v1 setTimeLimitInMinutes(int timeLimitInMinutes) {
278 this.timeLimitInMinutes = timeLimitInMinutes;
279 return this;
280 }
281
282 public UT2004DeathMatch1v1 setMatchName(String matchName) {
283 this.matchName = matchName;
284 return this;
285 }
286
287 public UT2004DeathMatch1v1 setBot1Name(String bot1Name) {
288 this.bot1Name = bot1Name;
289 return this;
290 }
291
292 public UT2004DeathMatch1v1 setBot1JarPath(String bot1JarPath) {
293 this.bot1JarPath = bot1JarPath;
294 return this;
295 }
296
297 public UT2004DeathMatch1v1 setBot2Name(String bot2Name) {
298 this.bot2Name = bot2Name;
299 return this;
300 }
301
302 public UT2004DeathMatch1v1 setBot2JarPath(String bot2JarPath) {
303 this.bot2JarPath = bot2JarPath;
304 return this;
305 }
306
307 public UT2004DeathMatch1v1 setUnrealHome(String unrealHome) {
308 this.unrealHome = unrealHome;
309 return this;
310 }
311
312 public UT2004DeathMatch1v1 setMapName(String mapName) {
313 this.mapName = mapName;
314 return this;
315 }
316
317 public UT2004DeathMatch1v1 setOutputDir(String outputDir) {
318 this.outputDir = outputDir;
319 return this;
320 }
321
322
323
324
325 public void cleanUp() {
326 try {
327 FileUtils.deleteQuietly(new File(getOutputDir() + File.separator + getMatchName()));
328 } catch (Exception e) {
329 }
330 }
331
332
333
334
335
336
337
338 protected UT2004DeathMatchConfig configure1Vs1() {
339 UT2004DeathMatchConfig matchConfig = new UT2004DeathMatchConfig();
340
341 matchConfig.setMatchId(getMatchName());
342 matchConfig.setOutputDirectory(new File("results" + File.separator + "matches"));
343
344 matchConfig.setFragLimit(getFragLimit());
345 matchConfig.setTimeLimit(getTimeLimitInMinutes());
346
347 matchConfig.getUccConf().setStartOnUnusedPort(true);
348 matchConfig.getUccConf().setUnrealHome(getUnrealHome());
349 matchConfig.getUccConf().setGameType("BotDeathMatch");
350 matchConfig.getUccConf().setMapName(getMapName());
351
352 UT2004BotConfig botConfig;
353
354 botConfig = new UT2004BotConfig();
355 botConfig.setBotId(getBot1Name());
356 botConfig.setPathToBotJar(getBot1JarPath());
357 botConfig.setTeamNumber(255);
358 botConfig.setRedirectStdErr(true);
359 botConfig.setRedirectStdOut(true);
360 matchConfig.addBot(botConfig);
361
362 botConfig = new UT2004BotConfig();
363 botConfig.setBotId(getBot2Name());
364 botConfig.setPathToBotJar(getBot2JarPath());
365 botConfig.setTeamNumber(255);
366 botConfig.setRedirectStdErr(true);
367 botConfig.setRedirectStdOut(true);
368 matchConfig.addBot(botConfig);
369
370 return matchConfig;
371 }
372
373
374
375
376
377
378 public UT2004DeathMatch createMatch() {
379 log.info("Configuring match: " + getMatchName());
380 UT2004DeathMatchConfig matchConfig = configure1Vs1();
381 UT2004DeathMatch match = new UT2004DeathMatch(matchConfig, log);
382 match.validate();
383 return match;
384 }
385
386
387
388
389
390
391
392
393
394
395
396 @Override
397 public void run() {
398 try {
399 cleanUp();
400
401 UT2004DeathMatch match = createMatch();
402
403 log.info("Executing match: " + getMatchName());
404
405 this.result = match.execute();
406
407 log.info("Match " + getMatchName() + " result: " + result);
408
409 log.info("---/// MATCH OK ///---");
410 } catch (Exception e) {
411 if (log != null && log.isLoggable(Level.SEVERE)) log.severe(ExceptionToString.process("Failed to execute the match: " + getMatchName() + ".", e));
412 this.exception = e;
413 if (e instanceof RuntimeException) throw (RuntimeException)e;
414 throw new PogamutException("Failed to execute the match: " + getMatchName(), e, this);
415 }
416 }
417
418 @Override
419 public UT2004DeathMatchResult call() throws Exception {
420 run();
421 return getResult();
422 }
423
424 }