View Javadoc

1   /**
2    * Emohawk Bot, an implementation of the environment interface standard that 
3    * facilitates the connection between GOAL and Emohawk. 
4    * 
5    * Copyright (C) 2012 Emohawk Bot authors.
6    * 
7    * This program is free software: you can redistribute it and/or modify it under
8    * the terms of the GNU General Public License as published by the Free Software
9    * Foundation, either version 3 of the License, or (at your option) any later
10   * version.
11   * 
12   * This program is distributed in the hope that it will be useful, but WITHOUT
13   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14   * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
15   * details.
16   * 
17   * You should have received a copy of the GNU General Public License along with
18   * this program. If not, see <http://www.gnu.org/licenses/>.
19   */
20  
21  package nl.tudelft.goal.ut2004.environment;
22  
23  import java.net.URI;
24  import java.rmi.RemoteException;
25  import java.util.HashMap;
26  import java.util.Map;
27  
28  import cz.cuni.amis.pogamut.ut2004.bot.impl.UT2004BotController;
29  import cz.cuni.amis.utils.flag.FlagListener;
30  
31  import nl.tudelft.goal.EIS2Java.handlers.ActionHandler;
32  import nl.tudelft.goal.EIS2Java.handlers.AllPerceptPerceptHandler;
33  import nl.tudelft.goal.EIS2Java.handlers.DefaultActionHandler;
34  import nl.tudelft.goal.EIS2Java.handlers.PerceptHandler;
35  import nl.tudelft.goal.EIS2Java.translation.Translator;
36  import nl.tudelft.goal.unreal.environment.AbstractUnrealEnvironment;
37  import nl.tudelft.goal.unreal.messages.BotParameters;
38  import nl.tudelft.goal.unreal.translators.LocationTranslator;
39  import nl.tudelft.goal.unreal.translators.RotationTranslator;
40  import nl.tudelft.goal.unreal.translators.TeamTranslator;
41  import nl.tudelft.goal.unreal.translators.UnrealIdTranslator;
42  import nl.tudelft.goal.unreal.translators.VelocityTranslator;
43  import nl.tudelft.goal.ut2004.agent.UT2004BotBehavior;
44  import nl.tudelft.goal.ut2004.translators.ItemTypeTranslator;
45  import nl.tudelft.goal.ut2004.translators.ComboTranslator;
46  import nl.tudelft.goal.ut2004.translators.FireModeTranslator;
47  import nl.tudelft.goal.ut2004.translators.FlagStateTranslator;
48  import nl.tudelft.goal.ut2004.translators.GameTypeTranslator;
49  import nl.tudelft.goal.ut2004.translators.CategoryTranslator;
50  import nl.tudelft.goal.ut2004.translators.NavigationStateTranslator;
51  import nl.tudelft.goal.ut2004.translators.NoneTranslator;
52  import nl.tudelft.goal.ut2004.translators.PerceptTranslator;
53  import nl.tudelft.goal.ut2004.translators.SelectorListTranslator;
54  import nl.tudelft.goal.ut2004.translators.SelectorTranslator;
55  import nl.tudelft.goal.ut2004.translators.UnrealIdOrLocationTranslator;
56  import nl.tudelft.goal.ut2004.translators.WeaponPrefListTranslator;
57  import nl.tudelft.goal.ut2004.translators.WeaponPrefTranslator;
58  import nl.tudelft.goal.ut2004.visualizer.connection.AddBotCommand;
59  import nl.tudelft.goal.ut2004.visualizer.connection.EnvironmentServiceListener;
60  import nl.tudelft.goal.ut2004.visualizer.connection.EnvironmentServiceMediator;
61  import nl.tudelft.goal.ut2004.visualizer.connection.client.RemoteVisualizer;
62  import nl.tudelft.goal.ut2004.visualizer.connection.client.VisualizerServiceDefinition;
63  import nl.tudelft.pogamut.base.server.ReconnectingServerDefinition;
64  import eis.exceptions.EntityException;
65  import eis.exceptions.ManagementException;
66  import eis.iilang.Identifier;
67  import eis.iilang.Parameter;
68  import eis.iilang.ParameterList;
69  
70  public class UT2004Environment extends AbstractUnrealEnvironment {
71  
72  	/**
73  	 * Generated serialVersionUID.
74  	 */
75  	private static final long serialVersionUID = 8240549393243585632L;
76  
77  	// Connection to the visualizer. Can be used to add bots to the environment.
78  	private ReconnectingServerDefinition<RemoteVisualizer> visualizerConnection;
79  
80  	@Override
81  	protected void registerTranslators() {
82  
83  		Translator translator = Translator.getInstance();
84  
85  		/*
86  		 * Translators provided by the BaseUnrealEnvironment.
87  		 * 
88  		 * Please list these in lexical order.
89  		 */
90  
91  		LocationTranslator locationTranslator = new LocationTranslator();
92  		translator.registerJava2ParameterTranslator(locationTranslator);
93  		translator.registerParameter2JavaTranslator(locationTranslator);
94  
95  		/*
96  		 * To translate from Parameter2Java we are given an UnrealId. However we
97  		 * can not access the agents memory during translation. To work around
98  		 * this we store everything we have send to any agent. Hence the same
99  		 * object has to be used for both directions.
100 		 */
101 		RotationTranslator rotationTranslator = new RotationTranslator();
102 		translator.registerJava2ParameterTranslator(rotationTranslator);
103 		translator.registerParameter2JavaTranslator(rotationTranslator);
104 
105 		TeamTranslator teamTranslator = new TeamTranslator();
106 		translator.registerJava2ParameterTranslator(teamTranslator);
107 		translator.registerParameter2JavaTranslator(teamTranslator);
108 
109 		UnrealIdTranslator unrealIdTranslator = new UnrealIdTranslator();
110 		translator.registerJava2ParameterTranslator(unrealIdTranslator);
111 		translator.registerParameter2JavaTranslator(unrealIdTranslator);
112 
113 		VelocityTranslator velocityTranslator = new VelocityTranslator();
114 		translator.registerJava2ParameterTranslator(velocityTranslator);
115 		translator.registerParameter2JavaTranslator(velocityTranslator);
116 		/*
117 		 * Translators provided by the UT2004 environment.
118 		 * 
119 		 * Please list these in lexical order.
120 		 */
121 
122 		CategoryTranslator itemTypeTranslator = new CategoryTranslator();
123 		translator.registerJava2ParameterTranslator(itemTypeTranslator);
124 
125 		ComboTranslator comboTranslator = new ComboTranslator();
126 		translator.registerParameter2JavaTranslator(comboTranslator);
127 
128 		FireModeTranslator fireModeTranslator = new FireModeTranslator();
129 		translator.registerJava2ParameterTranslator(fireModeTranslator);
130 		translator.registerParameter2JavaTranslator(fireModeTranslator);
131 
132 		FlagStateTranslator flagStateTranslator = new FlagStateTranslator();
133 		translator.registerJava2ParameterTranslator(flagStateTranslator);
134 
135 		GameTypeTranslator gameTypeTranslator = new GameTypeTranslator();
136 		translator.registerJava2ParameterTranslator(gameTypeTranslator);
137 
138 		ItemTypeTranslator categoryTranslator = new ItemTypeTranslator();
139 		translator.registerJava2ParameterTranslator(categoryTranslator);
140 		translator.registerParameter2JavaTranslator(categoryTranslator);
141 
142 		NavigationStateTranslator navigationStateTranslator = new NavigationStateTranslator();
143 		translator.registerJava2ParameterTranslator(navigationStateTranslator);
144 
145 		NoneTranslator noneTranslator = new NoneTranslator();
146 		translator.registerJava2ParameterTranslator(noneTranslator);
147 
148 		PerceptTranslator perceptTranslator = new PerceptTranslator();
149 		translator.registerJava2ParameterTranslator(perceptTranslator);
150 
151 		SelectorListTranslator selectorListTranslator = new SelectorListTranslator();
152 		translator.registerParameter2JavaTranslator(selectorListTranslator);
153 
154 		SelectorTranslator selectorTranslator = new SelectorTranslator();
155 		translator.registerParameter2JavaTranslator(selectorTranslator);
156 
157 		UnrealIdOrLocationTranslator unrealIdOrLocationTranslator = new UnrealIdOrLocationTranslator();
158 		translator.registerParameter2JavaTranslator(unrealIdOrLocationTranslator);
159 
160 		WeaponPrefListTranslator weaponPrefListTranslator = new WeaponPrefListTranslator();
161 		translator.registerParameter2JavaTranslator(weaponPrefListTranslator);
162 
163 		WeaponPrefTranslator weaponPrefTranslator = new WeaponPrefTranslator();
164 		translator.registerParameter2JavaTranslator(weaponPrefTranslator);
165 	}
166 
167 	public static void main(String[] args) throws ManagementException {
168 		HashMap<String, Parameter> map = new HashMap<String, Parameter>();
169 		map.put("botNames", new ParameterList(new Identifier("Test")));
170 		new UT2004Environment().init(map);
171 
172 	}
173 
174 	@Override
175 	protected Class<UT2004BotBehavior> getControlerClass() {
176 		return UT2004BotBehavior.class;
177 	}
178 
179 	@Override
180 	protected PerceptHandler createPerceptHandler(UT2004BotController controller) throws EntityException {
181 		return new AllPerceptPerceptHandler(controller);
182 	}
183 
184 	@Override
185 	protected ActionHandler createActionHandler(UT2004BotController controller) throws EntityException {
186 		return new DefaultActionHandler(controller);
187 	}
188 
189 	@Override
190 	protected synchronized void initializeEnvironment(Map<String, Parameter> parameters) throws ManagementException {
191 		super.initializeEnvironment(parameters);
192 
193 		// Set up (future) connection to visualizer. Connecting is done later.
194 		try {
195 			visualizerConnection = new ReconnectingServerDefinition<RemoteVisualizer>(new VisualizerServiceDefinition());
196 			visualizerConnection.getServerFlag().addListener(new VisualizerServiceListener());
197 		} catch (RemoteException e) {
198 			log.severe("Could not start connection to Visualizer: " + e);
199 		}
200 
201 	}
202 
203 	/**
204 	 * Helper class that handles the connection to the visualizer. Registers a
205 	 * mediator with the visualizer and listens to the actions it requests.
206 	 * 
207 	 * @author M.P. Korstanje
208 	 * 
209 	 */
210 	private class VisualizerServiceListener implements EnvironmentServiceListener, FlagListener<RemoteVisualizer> {
211 
212 		private final EnvironmentServiceMediator mediator;
213 
214 		public VisualizerServiceListener() throws RemoteException {
215 			mediator = new EnvironmentServiceMediator(getComponentId());
216 			mediator.setListener(this);
217 		}
218 
219 		@Override
220 		public void flagChanged(RemoteVisualizer visualizer) {
221 			if (visualizer != null) {
222 				visualizer.setEnvironment(mediator);
223 			}
224 		}
225 
226 		/**
227 		 * 
228 		 * 
229 		 * Listens to actions executed by the remote visualizer.
230 		 * 
231 		 * @throws ManagementException
232 		 * 
233 		 */
234 		@Override
235 		public void addBot(AddBotCommand command) throws ManagementException {
236 
237 			BotParameters parameters = new BotParameters(environmentLogger);
238 
239 			// Fill up bot paramters
240 			// FIXME: Not uptodate
241 			if (command.getBotName() != null) {
242 				parameters.setAgentId(command.getBotName());
243 			}
244 			if (command.getLogLevel() != null) {
245 				parameters.setLogLevel(command.getLogLevel());
246 			}
247 			if (command.getShouldLeadTarget() != null) {
248 				parameters.setShouldLeadTarget(command.getShouldLeadTarget());
249 			}
250 			if (command.getShowFocalPoint() != null) {
251 				parameters.setShouldLeadTarget(command.getShowFocalPoint());
252 			}
253 			if (command.getSkill() != null) {
254 				parameters.setSkill(command.getSkill());
255 			}
256 			if (command.getSkin() != null) {
257 				//parameters.setSkin(command.getSkin());
258 			}
259 			if (command.getTeam() != null) {
260 				parameters.setTeam(command.getTeam());
261 			}
262 
263 			// Take connection and other settings from init.
264 			parameters.assignDefaults(botParameters);
265 
266 			startAgents(parameters);
267 
268 		}
269 
270 	}
271 
272 	@Override
273 	protected synchronized void connectEnvironment() throws ManagementException {
274 		super.connectEnvironment();
275 
276 		// Connect to visualizer
277 		URI visualizerUri = environmentParameters.getVisualizerServer();
278 		if (visualizerUri != null) {
279 			log.info("Connecting to visualizer server at " + visualizerUri + " .");
280 
281 			visualizerConnection.setUri(visualizerUri);
282 		} else {
283 			log.info("No address for the visualizer server was provided. The environment will not try to connect to the visualizer.");
284 		}
285 	}
286 
287 	@Override
288 	protected synchronized void killEnvironment() {
289 		super.killEnvironment();
290 		// Close the connection to the visualizer.
291 		visualizerConnection.stopServer();
292 
293 	}
294 
295 }