View Javadoc

1   package cz.cuni.amis.pogamut.ut2004.bot.impl;
2   
3   import java.util.Random;
4   import java.util.logging.Level;
5   
6   import cz.cuni.amis.pogamut.base.agent.navigation.IPathPlanner;
7   import cz.cuni.amis.pogamut.base.agent.navigation.PathExecutorState;
8   import cz.cuni.amis.pogamut.base.communication.command.IAct;
9   import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.AnnotationListenerRegistrator;
10  import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.EventListener;
11  import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectClassEventListener;
12  import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectClassListener;
13  import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectEventListener;
14  import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectListener;
15  import cz.cuni.amis.pogamut.base.utils.math.DistanceUtils;
16  import cz.cuni.amis.pogamut.base3d.worldview.IVisionWorldView;
17  import cz.cuni.amis.pogamut.base3d.worldview.object.ILocated;
18  import cz.cuni.amis.pogamut.unreal.agent.navigation.IUnrealPathExecutor;
19  import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.AdrenalineCombo;
20  import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.AgentConfig;
21  import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.Raycasting;
22  import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.Weaponry;
23  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.AgentInfo;
24  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.AgentStats;
25  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.CTF;
26  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Game;
27  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.ItemDescriptors;
28  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Items;
29  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.NavigationGraphBuilder;
30  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Players;
31  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Senses;
32  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.WeaponPrefs;
33  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.visibility.Visibility;
34  import cz.cuni.amis.pogamut.ut2004.agent.navigation.IUT2004GetBackToNavGraph;
35  import cz.cuni.amis.pogamut.ut2004.agent.navigation.IUT2004Navigation;
36  import cz.cuni.amis.pogamut.ut2004.agent.navigation.IUT2004PathExecutor;
37  import cz.cuni.amis.pogamut.ut2004.agent.navigation.IUT2004RunStraight;
38  import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004AStarPathPlanner;
39  import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004GetBackToNavGraph;
40  import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004Navigation;
41  import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004PathExecutor;
42  import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004RunStraight;
43  import cz.cuni.amis.pogamut.ut2004.agent.navigation.floydwarshall.FloydWarshallMap;
44  import cz.cuni.amis.pogamut.ut2004.agent.navigation.loquenavigator.KefikRunner;
45  import cz.cuni.amis.pogamut.ut2004.agent.navigation.loquenavigator.LoqueNavigator;
46  import cz.cuni.amis.pogamut.ut2004.agent.navigation.stuckdetector.UT2004DistanceStuckDetector;
47  import cz.cuni.amis.pogamut.ut2004.agent.navigation.stuckdetector.UT2004PositionStuckDetector;
48  import cz.cuni.amis.pogamut.ut2004.agent.navigation.stuckdetector.UT2004TimeStuckDetector;
49  import cz.cuni.amis.pogamut.ut2004.bot.IUT2004BotController;
50  import cz.cuni.amis.pogamut.ut2004.bot.command.AdvancedLocomotion;
51  import cz.cuni.amis.pogamut.ut2004.bot.command.CompleteBotCommandsWrapper;
52  import cz.cuni.amis.pogamut.ut2004.bot.command.ImprovedShooting;
53  import cz.cuni.amis.pogamut.ut2004.communication.messages.ItemType;
54  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbcommands.GetPath;
55  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.AutoTraceRay;
56  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange;
57  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage;
58  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.NavPoint;
59  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.PathList;
60  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.Self;
61  import cz.cuni.amis.pogamut.ut2004.communication.translator.itemdescriptor.ItemDescriptor;
62  
63  /**
64   * The most advanced controller that is available. This controller contains all useful modules pre-instantiated.
65   *
66   * @author Jimmy
67   *
68   * @param <BOT>
69   */
70  public class UT2004BotModuleController<BOT extends UT2004Bot> extends UT2004BotLogicController<BOT> {
71  
72  	/**
73  	 * Random number generator that is usually useful to have during decision making.
74  	 */
75  	protected Random random = new Random(System.currentTimeMillis());
76  	
77  	/**
78  	 * Command module that is internally using {@link UT2004PathExecutor} for path-following and {@link FloydWarshallMap}
79  	 * for path planning resulting in unified class that can solely handle navigation of the bot within the environment.
80  	 * <p><p> 
81  	 * In contrast to {@link UT2004PathExecutor} methods
82  	 * of this module may be recalled every {@link UT2004BotModuleController#logic()} iteration even with 
83  	 * the same argument (which is not true for {@link UT2004PathExecutor#followPath(cz.cuni.amis.pogamut.base.agent.navigation.IPathFuture)}.
84  	 * <p><p>
85  	 * Note that this class is actually initialized with instances of {@link UT2004BotModuleController#pathExecutor} and {@link UT2004BotModuleController#fwMap}
86  	 * so you must take care if using add/remove stuck detectors or reinitilize this property to your liking (you can do that in {@link UT2004BotModuleController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 
87  	 * method.
88  	 * <p><p>
89  	 * May be used since first {@link UT2004BotModuleController#logic()} is called.
90       * <p><p>
91       * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}.
92  	 */
93  	protected IUT2004Navigation navigation;
94  	
95  	/**
96  	 * Memory module specialized on general info about the game - game type, time limit, frag limit, etc.
97  	 * <p><p>
98  	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)}
99       * is called.
100      * <p><p>
101      * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
102 	 */
103 	protected Game game;
104 	
105 	/**
106 	 * Memory module specialized on general info about the agent whereabouts - location, rotation, health, current weapon, who is enemy/friend, etc.
107 	 * <p><p>
108 	 * May be used since first {@link Self} message is received, i.e, since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 
109      * is called.
110      * <p><p>
111      * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
112 	 */
113 	protected AgentInfo info;
114 	
115 	/**
116 	 * Memory module specialized on whereabouts of other players - who is visible, enemy / friend, whether bot can see anybody, etc.
117 	 * <p><p>
118 	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)}
119      * is called.
120      * <p><p>
121      * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
122 	 */
123 	protected Players players;
124 	
125 	/**
126 	 * Sensory module that provides mapping between {@link ItemType} and {@link ItemDescriptor} providing
127      * an easy way to obtain item descriptors for various items in UT2004.
128      * <p><p>
129      * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)}
130      * is called.
131      * <p><p>
132      * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
133 	 */
134 	protected ItemDescriptors descriptors;
135 	
136 	/**
137 	 * Memory module specialized on items on the map - which are visible and which are probably spawned.
138 	 * <p><p>
139 	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)}
140      * is called.
141      * <p><p>
142      * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
143 	 */
144 	protected Items items;
145 	
146 	/**
147 	 * Memory module specialized on agent's senses - whether the bot has been recently killed, collide with level's geometry, etc.
148 	 * <p><p>
149 	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)}
150      * is called.
151      * <p><p>
152      * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
153 	 */
154 	protected Senses senses;
155 	
156 	/**
157 	 * Memory module specialized on info about the bot's weapon and ammo inventory - it can tell you which weapons are loaded, melee/ranged, etc.
158 	 * <p><p>
159 	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)}
160      * is called.
161      * <p><p>
162      * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
163 	 */
164 	protected Weaponry weaponry;
165 	
166 	/**
167 	 * Memory module specialized on the agent's configuration inside UT2004 - name, vision time, manual spawn, cheats (if enabled at GB2004).
168 	 * <p><p>
169 	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)}
170      * is called.
171      * <p><p>
172      * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
173 	 */
174 	protected AgentConfig config;
175 	
176 	/**
177 	 * Support for creating rays used for raycasting (see {@link AutoTraceRay} that is being utilized).
178 	 * <p><p>
179 	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)}
180      * is called.
181      * <p><p>
182      * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
183 	 */
184 	protected Raycasting raycasting;
185 	
186 	/**
187 	 * Wraps all available commands that can be issued to the virtual body of the bot inside UT2004.
188      * <p><p>
189      * May be used since since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 
190      * is called.
191      * <p><p>
192      * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
193 	 */
194 	protected CompleteBotCommandsWrapper body;
195 	
196 	/**
197 	 * Shortcut for <i>body.getAdvancedShooting()</i> that allows you to shoot at opponent.
198 	 * <p><p>
199 	 * Note: more weapon-handling methods are available through {@link UT2004BotModuleControllerNew#weaponry}.
200 	 * <p><p>
201 	 * May be used since since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 
202      * is called.
203      * <p><p>
204 	 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
205 	 */
206 	protected ImprovedShooting shoot;
207 	
208 	/**
209 	 * Shortcut for <i>body.getAdvancedLocomotion()</i> that allows you to manually steer the movement through the environment.
210 	 * <p><p>
211 	 * Note: navigation is done via {@link UT2004BotModuleControllerNew#pathExecutor} that needs {@link PathHandle} from the {@link UT2004BotModuleControllerNew#pathPlanner}.
212 	 * <p><p>
213 	 * May be used since since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 
214      * is called.
215      * <p><p>
216 	 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
217 	 */
218 	protected AdvancedLocomotion move;
219 	
220 	/**
221 	 * Module specialized on CTF games. Enabled only for CTF games, check {@link CTF#isEnabled()}.
222 	 * <p><p>
223 	 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
224 	 */
225 	protected CTF ctf;
226 	
227 	/**
228 	 * Module for adrenaline combos.
229 	 */
230 	protected AdrenalineCombo combo;
231 	
232 	/**
233      * Executor is used for following a path in the environment.
234      * <p><p>
235      * May be used since since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 
236      * is called.
237      * <p><p>
238      * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}.
239      * <p><p>
240      * {@link UT2004PathExecutor#addStuckDetector(cz.cuni.amis.pogamut.base.agent.navigation.IStuckDetector)} is initialized with default stuck detectors:
241      * {@link UT2004TimeStuckDetector}, {@link UT2004PositionStuckDetector}, {@link UT2004DistanceStuckDetector}.
242      * <p><p>
243      * If one of stuck detectors (heuristicly) finds out that the bot has stuck somewhere,
244      * it reports it back to {@link UT2004PathExecutor} and the path executor will stop following the path switching
245      * itself to {@link PathExecutorState#STUCK}, which in turn allows us to issue another follow-path command in the right time.
246      */
247 	protected IUT2004PathExecutor<ILocated> pathExecutor = null;
248 	
249     /**
250      * Planner used to compute the path (consisting of navigation points) inside the map.
251      * <p><p>
252      * May be used since since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 
253      * is called.
254      * <p><p>
255      * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}.
256      */
257     protected IPathPlanner<ILocated> pathPlanner = null;
258     
259     /**
260      * Navigation graph builder that may be used to manually extend the navigation graph of the UT2004.
261      * <p><p>
262      * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 
263      * is called.
264      * <p><p>
265      * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
266      */
267     protected NavigationGraphBuilder navBuilder = null;
268     
269     /**
270      * Listener registrator that probes declared methods for the presence of {@link EventListener}, {@link ObjectClassEventListener},
271      * {@link ObjectClassListener}, {@link ObjectEventListener} and {@link ObjectListener} annotations and automatically registers
272      * them as listeners on a specific events.
273      * <p><p>
274      * Note that this registrator is usable for 'this' object only! It will work only for 'this' object.
275      */
276     protected AnnotationListenerRegistrator listenerRegistrator;
277     
278     /**
279      * Weapon preferences for your bot. See {@link WeaponPrefs} class javadoc. It allows you to define preferences for
280      * weapons to be used at given distance (together with their firing modes).
281      */
282     protected WeaponPrefs weaponPrefs;
283     
284     /**
285      * Shortcut for the {@link UT2004Bot#getWorldView()}.
286      */
287     protected IVisionWorldView world;
288     
289     /**
290      * Shortcut for the {@link UT2004Bot#getAct()}.
291      */
292     protected IAct act;
293     
294     /**
295      * Module that is providing various statistics about the bot. You may also used it to output these stats (in CSV format)
296      * into some file using {@link AgentStats#startOutput(String)} or {@link AgentStats#startOutput(String, boolean)}.
297      */
298     protected AgentStats stats;
299 
300     /**
301      * Path-planner ({@link IPathPlanner} using {@link NavPoint}s), you may use it to find paths inside the environment wihtout
302      * waiting for round-trip of {@link GetPath} command and {@link PathList}s response from UT2004. It is much faster than 
303      * {@link UT2004BotModuleController#pathPlanner} but you need to pass {@link NavPoint} instances to planner instead of
304      * {@link ILocated} ... to find the nearest {@link NavPoint} instance, {@link DistanceUtils} is a handy, check especially
305      * {@link DistanceUtils#getNearest(java.util.Collection, ILocated)}.
306      */
307 	protected FloydWarshallMap fwMap;
308 	
309 	/**
310 	 * Navigation helper that is able to get your bot back to the nearest navigation graph so you can use {@link UT2004BotModuleController#navigation} 
311 	 * without fear of catastrophe.
312 	 * <p><p>
313 	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 
314      * is called.
315      * <p><p>
316      * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}.
317 	 */
318 	protected IUT2004GetBackToNavGraph getBackToNavGraph;
319 	
320 	/**
321 	 * Navigation helper that can run-straight to some point with stuck detectors.
322 	 * <p><p>
323 	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 
324      * is called.
325      * <p><p>
326      * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}.
327 	 */
328 	protected IUT2004RunStraight runStraight;
329 	
330 	/**
331 	 * Module that provides visibility/cover information for the map.
332 	 * <p><p>
333 	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 
334      * is called.
335      * <p><p>
336      * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
337 	 */
338 	protected Visibility visibility;
339 	
340     @Override
341 	public void initializeController(BOT bot) {    	
342 		super.initializeController(bot);
343 		world = getWorldView();
344 		act = getAct();
345 		initializeModules(bot);
346 		initializePathFinding(bot);
347 		initializeListeners(bot);
348 	}
349 	
350     /**
351      * Initializes {@link UT2004BotModuleControllerNew#listenerRegistrator} and calls {@link AnnotationListenerRegistrator#addListeners()} method
352      * to probe all declared methods for event-annotation presence.
353      * @param bot
354      */
355 	protected void initializeListeners(BOT bot) {
356 		listenerRegistrator = new AnnotationListenerRegistrator(this, getWorldView(), bot.getLogger().getCategory("Listeners"));
357 		listenerRegistrator.addListeners();
358 	}
359 
360 	/**
361 	 * Initializes path-finding modules: {@link UT2004BotModuleControllerNew#pathPlanner}, {@link UT2004BotModuleController#fwMap} and {@link UT2004BotModuleControllerNew#pathExecutor}.
362 	 * If you need different path planner / path executor - override this method and initialize your own modules.
363 	 * @param bot
364 	 */
365 	protected void initializePathFinding(BOT bot) {
366 		pathPlanner  = new UT2004AStarPathPlanner(bot);
367 		fwMap        = new FloydWarshallMap(bot);
368 		pathExecutor = 
369         	new UT2004PathExecutor<ILocated>(
370         		bot, 
371         		new LoqueNavigator<ILocated>(bot, bot.getLog()), 
372         		bot.getLog()
373         	);
374 		
375 		// add stuck detectors that watch over the path-following, if it (heuristicly) finds out that the bot has stuck somewhere,
376     	// it reports an appropriate path event and the path executor will stop following the path which in turn allows 
377     	// us to issue another follow-path command in the right time
378         pathExecutor.addStuckDetector(new UT2004TimeStuckDetector(bot, 3000, 100000)); // if the bot does not move for 3 seconds, considered that it is stuck
379         pathExecutor.addStuckDetector(new UT2004PositionStuckDetector(bot));           // watch over the position history of the bot, if the bot does not move sufficiently enough, consider that it is stuck
380         pathExecutor.addStuckDetector(new UT2004DistanceStuckDetector(bot));           // watch over distances to target
381         
382 		getBackToNavGraph = new UT2004GetBackToNavGraph(bot, info, move);
383 		runStraight = new UT2004RunStraight(bot, info, move);
384 		navigation = new UT2004Navigation(bot, pathExecutor, fwMap, getBackToNavGraph, runStraight);                
385 	}
386 
387 	/**
388 	 * Initializes memory/command modules of the bot.
389 	 * 
390 	 * @param bot
391 	 */
392 	protected void initializeModules(BOT bot) {
393 		game        = new Game(bot);
394 		info        = new AgentInfo(bot, game);
395 		visibility  = new Visibility(bot, info);
396 		ctf         = new CTF(bot, info);
397 		players     = new Players(bot);
398 		descriptors = new ItemDescriptors(bot);
399 		weaponry    = new Weaponry(bot, descriptors);
400 		items       = new Items(bot, info, game, weaponry, null);
401 		senses      = new Senses(bot, info, players);
402 		config      = new AgentConfig(bot);
403 		raycasting  = new Raycasting(bot);
404 		body        = new CompleteBotCommandsWrapper(bot, weaponry, null);		
405 		shoot       = body.getImprovedShooting();
406 		move        = body.getLocomotion();
407 		navBuilder  = new NavigationGraphBuilder(bot);
408 		stats       = new AgentStats(bot);
409 		weaponPrefs = new WeaponPrefs(weaponry, bot);
410 		combo       = new AdrenalineCombo(bot, info);
411 	}
412 	
413 	@Override
414 	public void finishControllerInitialization() {
415 		if (navBuilder.isUsed()) {
416 			log.info("Navigation graph has been altered by 'navBuilder', triggering recomputation of Floyd-Warshall path matrix...");
417 			Level oldLevel = fwMap.getLog().getLevel();
418 			fwMap.getLog().setLevel(Level.FINER);
419 			fwMap.refreshPathMatrix();
420 			fwMap.getLog().setLevel(oldLevel);
421 		}
422 	}
423 
424 	//
425 	//
426 	// MODULE GETTERS
427 	//
428 	//
429 	
430 	public Random getRandom() {
431 		return random;
432 	}
433 
434 	public Game getGame() {
435 		return game;
436 	}
437 
438 	public AgentInfo getInfo() {
439 		return info;
440 	}
441 
442 	public Players getPlayers() {
443 		return players;
444 	}
445 
446 	public ItemDescriptors getDescriptors() {
447 		return descriptors;
448 	}
449 
450 	public Items getItems() {
451 		return items;
452 	}
453 
454 	public Senses getSenses() {
455 		return senses;
456 	}
457 
458 	public Weaponry getWeaponry() {
459 		return weaponry;
460 	}
461 
462 	public AgentConfig getConfig() {
463 		return config;
464 	}
465 
466 	public Raycasting getRaycasting() {
467 		return raycasting;
468 	}
469 
470 	public CompleteBotCommandsWrapper getBody() {
471 		return body;
472 	}
473 
474 	public ImprovedShooting getShoot() {
475 		return shoot;
476 	}
477 
478 	public AdvancedLocomotion getMove() {
479 		return move;
480 	}
481 
482 	public IUnrealPathExecutor<ILocated> getPathExecutor() {
483 		return pathExecutor;
484 	}
485 
486 	public IPathPlanner<ILocated> getPathPlanner() {
487 		return pathPlanner;
488 	}
489 	
490 	public AdrenalineCombo getCombo() {
491 		return combo;
492 	}
493 
494 	public NavigationGraphBuilder getNavBuilder() {
495 		return navBuilder;
496 	}
497 
498 	public WeaponPrefs getWeaponPrefs() {
499 		return weaponPrefs;
500 	}
501 
502 	public IVisionWorldView getWorld() {
503 		return world;
504 	}
505 
506 	public AgentStats getStats() {
507 		return stats;
508 	}
509 
510 	public FloydWarshallMap getFwMap() {
511 		return fwMap;
512 	}
513 	
514 	public IUT2004Navigation getNavigation() {
515 		return navigation;
516 	}
517 
518 	public Visibility getVisibility() {
519 		return visibility;
520 	}
521 
522 }