View Javadoc

1   package cz.cuni.amis.pogamut.sposh.context;
2   
3   import java.util.Random;
4   import java.util.logging.Level;
5   
6   import cz.cuni.amis.pathfinding.map.IPFMapView;
7   import cz.cuni.amis.pogamut.base.agent.navigation.IPathPlanner;
8   import cz.cuni.amis.pogamut.base.communication.command.IAct;
9   import cz.cuni.amis.pogamut.base.communication.worldview.IWorldView;
10  import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.AnnotationListenerRegistrator;
11  import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.EventListener;
12  import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectClassEventListener;
13  import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectClassListener;
14  import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectEventListener;
15  import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectListener;
16  import cz.cuni.amis.pogamut.base.utils.logging.LogCategory;
17  import cz.cuni.amis.pogamut.base.utils.math.DistanceUtils;
18  import cz.cuni.amis.pogamut.base3d.worldview.IVisionWorldView;
19  import cz.cuni.amis.pogamut.base3d.worldview.object.ILocated;
20  import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.AdrenalineCombo;
21  import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.AgentConfig;
22  import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.Raycasting;
23  import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.Weaponry;
24  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.AgentInfo;
25  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.AgentStats;
26  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.CTF;
27  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Game;
28  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.ItemDescriptors;
29  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Items;
30  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.NavPoints;
31  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.NavigationGraphBuilder;
32  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Players;
33  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Senses;
34  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.WeaponPrefs;
35  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.visibility.Visibility;
36  import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004AStarPathPlanner;
37  import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004GetBackToNavGraph;
38  import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004Navigation;
39  import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004PathExecutor;
40  import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004RunStraight;
41  import cz.cuni.amis.pogamut.ut2004.agent.navigation.astar.UT2004AStar;
42  import cz.cuni.amis.pogamut.ut2004.agent.navigation.floydwarshall.FloydWarshallMap;
43  import cz.cuni.amis.pogamut.ut2004.agent.navigation.loquenavigator.KefikRunner;
44  import cz.cuni.amis.pogamut.ut2004.agent.navigation.loquenavigator.LoqueNavigator;
45  import cz.cuni.amis.pogamut.ut2004.bot.IUT2004BotController;
46  import cz.cuni.amis.pogamut.ut2004.bot.command.AdvancedLocomotion;
47  import cz.cuni.amis.pogamut.ut2004.bot.command.CompleteBotCommandsWrapper;
48  import cz.cuni.amis.pogamut.ut2004.bot.command.ImprovedShooting;
49  import cz.cuni.amis.pogamut.ut2004.bot.impl.UT2004Bot;
50  import cz.cuni.amis.pogamut.ut2004.bot.impl.UT2004BotController;
51  import cz.cuni.amis.pogamut.ut2004.bot.impl.UT2004BotModuleController;
52  import cz.cuni.amis.pogamut.ut2004.communication.messages.ItemType;
53  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbcommands.GetPath;
54  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.AutoTraceRay;
55  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.BotKilled;
56  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange;
57  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo;
58  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage;
59  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.NavPoint;
60  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.PathList;
61  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.Self;
62  import cz.cuni.amis.pogamut.ut2004.communication.translator.itemdescriptor.ItemDescriptor;
63  
64  /**
65   * Primitive State Context for UT2004.
66   * @author Honza
67   */
68  public class UT2004Context<BOT extends UT2004Bot> extends Context<BOT> implements IUT2004Context<BOT> {
69  
70  	/**
71  	 * Random number generator that is usually useful to have during decision making.
72  	 */
73  	protected Random random = new Random(System.currentTimeMillis());
74  	    
75      /**
76       * Alias for user's log.
77       */
78      protected LogCategory log = null;
79  	
80  	/**
81  	 * Memory module specialized on general info about the game - game type, time limit, frag limit, etc.
82  	 * <p><p>
83  	 * May be used since {@link SposhBotLogic#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)}
84       * is called.
85       * <p><p>
86       * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
87  	 */
88  	protected Game game;
89  	
90  	/**
91  	 * Memory module specialized on general info about the agent whereabouts - location, rotation, health, current weapon, who is enemy/friend, etc.
92  	 * <p><p>
93  	 * May be used since first {@link Self} message is received, i.e, since the first {@link SposhBotLogic#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 
94       * is called.
95       * <p><p>
96       * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
97  	 */
98  	protected AgentInfo info;
99  	
100 	/**
101 	 * Memory module specialized on whereabouts of other players - who is visible, enemy / friend, whether bot can see anybody, etc.
102 	 * <p><p>
103 	 * May be used since {@link SposhBotLogic#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)}
104      * is called.
105      * <p><p>
106      * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
107 	 */
108 	protected Players players;
109 	
110 	/**
111 	 * Sensory module that provides mapping between {@link ItemType} and {@link ItemDescriptor} providing
112      * an easy way to obtain item descriptors for various items in UT2004.
113      * <p><p>
114      * May be used since {@link SposhBotLogic#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)}
115      * is called.
116      * <p><p>
117      * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
118 	 */
119 	protected ItemDescriptors descriptors;
120 	
121 	/**
122 	 * Memory module specialized on items on the map - which are visible and which are probably spawned.
123 	 * <p><p>
124 	 * May be used since {@link SposhBotLogic#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)}
125      * is called.
126      * <p><p>
127      * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
128 	 */
129 	protected Items items;
130 	
131 	/**
132 	 * Memory module specialized on agent's senses - whether the bot has been recently killed, collide with level's geometry, etc.
133 	 * <p><p>
134 	 * May be used since {@link SposhBotLogic#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)}
135      * is called.
136      * <p><p>
137      * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
138 	 */
139 	protected Senses senses;
140 	
141 	/**
142 	 * Memory module specialized on info about the bot's weapon and ammo inventory - it can tell you which weapons are loaded, melee/ranged, etc.
143 	 * <p><p>
144 	 * May be used since {@link SposhBotLogic#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)}
145      * is called.
146      * <p><p>
147      * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
148 	 */
149 	protected Weaponry weaponry;
150 	
151 	/**
152 	 * Memory module specialized on the agent's configuration inside UT2004 - name, vision time, manual spawn, cheats (if enabled at GB2004).
153 	 * <p><p>
154 	 * May be used since {@link SposhBotLogic#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)}
155      * is called.
156      * <p><p>
157      * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
158 	 */
159 	protected AgentConfig config;
160 	
161 	/**
162 	 * Support for creating rays used for raycasting (see {@link AutoTraceRay} that is being utilized).
163 	 * <p><p>
164 	 * May be used since {@link SposhBotLogic#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)}
165      * is called.
166 	 */
167 	protected Raycasting raycasting;
168 	
169 	/**
170 	 * Module for adrenaline combos.
171 	 */
172 	protected AdrenalineCombo combo;
173 	
174 	/**
175 	 * Creates and wraps all available commands that can be issued to the virtual body of the bot inside UT2004.
176      * <p><p>
177      * May be used since since the first {@link SposhBotLogic#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 
178      * is called.
179      * <p><p>
180      * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
181 	 */
182 	protected CompleteBotCommandsWrapper body;
183 	
184 	/**
185 	 * Shortcut for <i>body.getImprovedShooting()</i> that allows you to shoot at opponent.
186 	 * <p><p>
187 	 * Note: more weapon-handling methods are available through {@link UT2004Behaviour#weaponry}.
188 	 * <p><p>
189 	 * May be used since since the first {@link SposhBotLogic#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 
190      * is called.
191      * <p><p>
192 	 * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
193 	 */
194 	protected ImprovedShooting shoot;
195 	
196 	/**
197 	 * Shortcut for <i>body.getAdvancedLocomotion()</i> that allows you to manually steer the movement through the environment.
198 	 * <p><p>
199 	 * Note: navigation is done via {@link UT2004Behaviour#pathExecutor} that needs {@link PathHandle} from the {@link UT2004Behaviour#pathPlanner}.
200 	 * <p><p>
201 	 * May be used since since the first {@link SposhBotLogic#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 
202      * is called.
203      * <p><p>
204 	 * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
205 	 */
206 	protected AdvancedLocomotion move;
207 	
208 	/**
209      * Executor is used for following a path in the environment.
210      * <p><p>
211      * May be used since since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)}
212      * is called.
213      * <p><p>
214      * Initialized inside {@link UT2004BotModuleControllerNew#initializePathFinding(UT2004Bot)}.
215      */
216 	protected UT2004PathExecutor<ILocated> pathExecutor = null;
217 
218     /**
219      * Planner used to compute the path (consisting of navigation points) inside the map.
220      * <p><p>
221      * May be used since since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)}
222      * is called.
223      * <p><p>
224      * Initialized inside {@link UT2004BotModuleControllerNew#initializePathFinding(UT2004Bot)}.
225      */
226     protected IPathPlanner<ILocated> pathPlanner = null;
227     
228     /**
229      * Weapon preferences for your bot. See {@link WeaponPrefs} class javadoc. It allows you to define preferences for
230      * weapons to be used at given distance (together with their firing mode).
231      */
232     protected WeaponPrefs weaponPrefs;
233     
234     /**
235      * Navigation graph builder that may be used to manually extend the navigation graph of the UT2004.
236      * <p><p>
237      * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 
238      * is called.
239      * <p><p>
240      * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
241      */
242     protected NavigationGraphBuilder navBuilder;
243     
244     /**
245      * Module that is providing various statistics about the bot. You may also used it to output these stats (in CSV format)
246      * into some file using {@link AgentStats#startOutput(String)} or {@link AgentStats#startOutput(String, boolean)}.
247      */
248     protected AgentStats stats;
249 
250     /**
251      * Path-planner ({@link IPathPlanner} using {@link NavPoint}s), you may use it to find paths inside the environment wihtout
252      * waiting for round-trip of {@link GetPath} command and {@link PathList}s response from UT2004. It is much faster than 
253      * {@link UT2004BotModuleController#pathPlanner} but you need to pass {@link NavPoint} instances to planner instead of
254      * {@link ILocated} ... to find the nearest {@link NavPoint} instance, {@link DistanceUtils} is a handy, check especially
255      * {@link DistanceUtils#getNearest(java.util.Collection, ILocated)}.
256      */
257 	protected FloydWarshallMap fwMap;
258 	
259 	/**
260 	 * Command module that is internally using {@link UT2004PathExecutor} for path-following and {@link FloydWarshallMap}
261 	 * for path planning resulting in unified class that can solely handle navigation of the bot within the environment.
262 	 * <p><p> 
263 	 * In contrast to {@link UT2004PathExecutor} methods
264 	 * of this module may be recalled every {@link UT2004BotModuleController#logic()} iteration even with 
265 	 * the same argument (which is not true for {@link UT2004PathExecutor#followPath(cz.cuni.amis.pogamut.base.agent.navigation.IPathFuture)}.
266 	 * <p><p>
267 	 * Note that this class is actually initialized with instances of {@link UT2004BotModuleController#pathExecutor} and {@link UT2004BotModuleController#fwMap}
268 	 * 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)} 
269 	 * method.
270 	 * <p><p>
271 	 * May be used since first {@link UT2004BotModuleController#logic()} is called.
272      * <p><p>
273      * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}.
274 	 */
275 	protected UT2004Navigation navigation;
276     
277     /**
278      * Listener registrator that probes declared methods for the presence of {@link EventListener}, {@link ObjectClassEventListener},
279      * {@link ObjectClassListener}, {@link ObjectEventListener} and {@link ObjectListener} annotations and automatically registers
280      * them as listeners on a specific events.
281      * <p><p>
282      * Note that this registrator is usable for 'this' object only! It will work only for 'this' object.
283      */
284     protected AnnotationListenerRegistrator listenerRegistrator;
285     
286     /**
287      * Shortcut for the {@link UT2004BotModuleController#getWorldView()}.
288      */
289     protected IVisionWorldView world;
290     
291     /**
292      * Shortcut for the {@link UT2004BotModuleController#getAct()}.
293      */
294     protected IAct act;
295 
296     /**
297 	 * Navigation helper that is able to get your bot back to the nearest navigation graph so you can use {@link UT2004BotModuleController#navigation} 
298 	 * without fear of catastrophe.
299 	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 
300      * is called.
301      * <p><p>
302      * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}.
303 	 */
304 	protected UT2004GetBackToNavGraph getBackToNavGraph;
305 	
306 	/**
307 	 * Navigation helper that can run-straight to some point with stuck detectors.
308 	 * <p><p>
309 	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 
310      * is called.
311      * <p><p>
312      * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}.
313 	 */
314 	protected UT2004RunStraight runStraight;
315 	
316 	/**
317 	 * Module that provides visibility/cover information for the map.
318 	 * <p><p>
319 	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 
320      * is called.
321      * <p><p>
322      * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
323 	 */
324 	protected Visibility visibility;
325 	
326 	/**
327 	 * Module specialized on CTF games. Enabled only for CTF games, check {@link CTF#isEnabled()}.
328 	 * <p><p>
329 	 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
330 	 */
331 	protected CTF ctf;
332 	
333 	/**
334 	 * Module that provides shortcut for getting {@link NavPoint}s out of {@link IWorldView}.
335 	 * <p><p>
336 	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 
337      * is called.
338      * <p><p>
339      * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
340 	 */
341 	protected NavPoints navPoints;
342 	
343 	/**
344 	 * Class providing A-Star algorithm over the navpoints as they are present within the {@link IWorldView}.
345 	 * <p><p>
346 	 * You may provide custom {@link IPFMapView} over the map in-order to greatly customize the A-Star search.
347 	 */
348 	protected UT2004AStar aStar;
349 
350 	public UT2004Context(String name, BOT bot) {
351 		super(name, bot);
352         log = bot.getLogger().getCategory(UT2004BotController.USER_LOG_CATEGORY_ID);
353         log.setLevel(Level.ALL);
354 	}
355 
356 	/**
357 	 * Called after the construction of the {@link UT2004Behaviour} before the GameBots2004 greets the bot even before
358 	 * {@link UT2004Behaviour#prepareBehaviour(UT2004Bot)} method.
359 	 * <p><p>
360 	 * <b>NOTE:</b> This is Pogamut's developers reserved method - do not override it and if you do, always use 'super' 
361 	 * to call parent's initializeBehaviour.
362      */
363 	protected void initialize() {
364 		initializeModules(bot);
365 		initializePathFinding(bot);
366 		initializeListeners(bot);
367 	}
368 	
369 	/**
370      * Initializes {@link UT2004Behaviour#listenerRegistrator} and calls {@link AnnotationListenerRegistrator#addListeners()} method
371      * to probe all declared methods for event-annotation presence.
372      * @param bot
373      */
374 	protected void initializeListeners(BOT bot) {
375 		listenerRegistrator = new AnnotationListenerRegistrator(this, getWorldView(), bot.getLogger().getCategory("Listeners"));
376 		listenerRegistrator.addListeners();
377 	}
378 
379 	/**
380 	 * Initializes path-finding modules: {@link UT2004BotModuleControllerNew#pathPlanner} and {@link UT2004BotModuleControllerNew#pathExecutor}.
381 	 * If you need different path planner / path executor - override this method and initialize your own modules.
382 	 * @param bot
383 	 */
384 	protected void initializePathFinding(BOT bot) {
385 		pathPlanner  = new UT2004AStarPathPlanner(bot);
386 		fwMap        = new FloydWarshallMap(bot);
387 		aStar       = new UT2004AStar(bot);		
388 		pathExecutor = 
389         	new UT2004PathExecutor<ILocated>(
390         		bot, 
391         		new LoqueNavigator<ILocated>(bot, 
392         		bot.getLog())
393         	);   
394 		getBackToNavGraph = new UT2004GetBackToNavGraph(bot, info, move);
395                 runStraight = new UT2004RunStraight(bot, info, move);
396 		navigation = new UT2004Navigation(bot, pathExecutor, fwMap, getBackToNavGraph, runStraight);
397 	}
398 
399 	/**
400 	 * Initializes memory/command modules of the bot.
401 	 * 
402 	 * @param bot
403 	 */
404 	protected void initializeModules(BOT bot) {
405 		world       = getWorldView();
406 		act         = getAct();
407 		
408 		game        = new Game(bot);
409 		navPoints   = new NavPoints(bot);
410 		players     = new Players(bot);
411 		descriptors = new ItemDescriptors(bot);
412 		config      = new AgentConfig(bot);
413 		raycasting  = new Raycasting(bot);
414 		stats       = new AgentStats(bot);
415 		navBuilder  = new NavigationGraphBuilder(bot);
416 		info        = new AgentInfo(bot, game);
417 		visibility  = new Visibility(bot, info);
418 		ctf         = new CTF(bot, info);
419 		weaponry    = new Weaponry(bot, descriptors);
420 		items       = new Items(bot, info, game, weaponry, null);
421 		senses      = new Senses(bot, info, players);
422 		body        = new CompleteBotCommandsWrapper(bot, weaponry, null);		
423 		shoot       = body.getImprovedShooting();
424 		move        = body.getLocomotion();
425 		weaponPrefs = new WeaponPrefs(weaponry, bot);
426 		combo       = new AdrenalineCombo(bot, info);
427 	}
428 	
429 	/**
430 	 * Called after the behaviour construction to initialize user's data structures.
431 	 * @param bot
432 	 */
433 	protected void prepareBehaviour(BOT bot) {		
434 	}	
435 	
436 	/**
437      * This method is called whenever {@link InitedMessage} is received. Various agent modules are usable since this
438      * method is called.
439      * 
440      * @param gameInfo
441      * @param config
442      * @param init
443      * @param self
444      */
445     public void botInitialized(GameInfo info, ConfigChange config, InitedMessage init) {
446     }
447 
448     /**
449      * This method is called only once whenever first batch of information what the bot can see is received.
450      * <i><i>
451      * It is sort of "first-logic-method" where you may issue commands for the first time and handle everything
452      * else in bot's logic then. It eliminates the need to have 'boolean firstLogic' field inside your bot.
453      * <p><p>
454      * Note that this method has advantage over the {@link IUT2004BotController#botInitialized(GameInfo, ConfigChange, InitedMessage)}
455      * that you already have {@link Self} object.
456      * 
457      * @param gameInfo
458      * @param config
459      * @param init
460      * @param self
461      */
462     public void botSpawned(GameInfo gameInfo, ConfigChange config, InitedMessage init, Self self) {
463     }
464     
465     /**
466 	 * Called after {@link UT2004Behaviour#botFirstSpawn(GameInfo, ConfigChange, InitedMessage, Self)} as a hook for Pogamut's core developers
467 	 * to finalize initialization of various modules.
468 	 * <p><p>
469 	 * <b>NOTE:</b> This is Pogamut's developers reserved method - do not override it and if you do, always use 'super' 
470 	 * to call parent's finishControllerInitialization.
471      */
472     public void finishInitialization() {
473     	if (navBuilder.isUsed()) {
474 			log.info("Navigation graph has been altered by 'navBuilder', triggering recomputation of Floyd-Warshall path matrix...");
475 			Level oldLevel = fwMap.getLog().getLevel();
476 			fwMap.getLog().setLevel(Level.FINER);
477 			fwMap.refreshPathMatrix();
478 			fwMap.getLog().setLevel(oldLevel);
479 			
480 			aStar.mapChanged();
481 		}
482     }
483     
484     /**
485      * This method is called before the SPOSH iteration is invoked. You may clear previous-state variables here.
486      */
487     public void logicIteration() {    	
488     }
489     
490     /**
491      * Called whenever the bot gets killed inside the game.
492      * 
493      * @param event
494      */
495 	public void botKilled(BotKilled event) {		
496 	}
497 	
498 	public IVisionWorldView getWorldView() {
499 		return bot.getWorldView();
500 	}
501 	
502 	public IAct getAct() {
503 		return bot.getAct();
504 	}
505 
506 	public CompleteBotCommandsWrapper getBody() {
507 		return body;
508 	}
509 
510 	public Random getRandom() {
511 		return random;
512 	}
513 
514 	public LogCategory getLog() {
515 		return log;
516 	}
517 	
518 	public UT2004AStar getAStar() {
519 		return aStar;
520 	}
521 
522 	public Game getGame() {
523 		return game;
524 	}
525 
526 	public AgentInfo getInfo() {
527 		return info;
528 	}
529 
530 	public Players getPlayers() {
531 		return players;
532 	}
533 
534 	public ItemDescriptors getDescriptors() {
535 		return descriptors;
536 	}
537 
538 	public Items getItems() {
539 		return items;
540 	}
541 
542 	public Senses getSenses() {
543 		return senses;
544 	}
545 
546 	public Weaponry getWeaponry() {
547 		return weaponry;
548 	}
549 
550 	public AgentConfig getConfig() {
551 		return config;
552 	}
553 
554 	public Raycasting getRaycasting() {
555 		return raycasting;
556 	}
557 
558 	public ImprovedShooting getShoot() {
559 		return shoot;
560 	}
561 
562 	public AdvancedLocomotion getMove() {
563 		return move;
564 	}
565 
566 	public UT2004PathExecutor<ILocated> getPathExecutor() {
567 		return pathExecutor;
568 	}
569 
570 	public IPathPlanner<ILocated> getPathPlanner() {
571 		return pathPlanner;
572 	}
573 
574 	public WeaponPrefs getWeaponPrefs() {
575 		return weaponPrefs;
576 	}
577 
578 	public NavigationGraphBuilder getNavBuilder() {
579 		return navBuilder;
580 	}
581 
582 	public AgentStats getStats() {
583 		return stats;
584 	}
585 
586 	public FloydWarshallMap getFwMap() {
587 		return fwMap;
588 	}
589 
590 	public UT2004Navigation getNavigation() {
591 		return navigation;
592 	}
593 
594 	public AnnotationListenerRegistrator getListenerRegistrator() {
595 		return listenerRegistrator;
596 	}
597 
598 	public IVisionWorldView getWorld() {
599 		return world;
600 	}
601 	
602 	public UT2004GetBackToNavGraph getBackToNavGraph() {
603 		return getBackToNavGraph;
604 	}
605 
606 	public CTF getCtf() {
607 		return ctf;
608 	}
609 
610 	public Visibility getVisibility() {
611 		return visibility;
612 	}
613 	
614 	public AdrenalineCombo getCombo() {
615 		return combo;
616 	}
617 
618 }