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 nl.tudelft.goal.unreal.environment.AbstractUnrealEnvironment;
29  import nl.tudelft.goal.unreal.messages.BotParameters;
30  import nl.tudelft.goal.unreal.translators.LocationTranslator;
31  import nl.tudelft.goal.unreal.translators.RotationTranslator;
32  import nl.tudelft.goal.unreal.translators.TeamTranslator;
33  import nl.tudelft.goal.unreal.translators.UnrealIdTranslator;
34  import nl.tudelft.goal.unreal.translators.VelocityTranslator;
35  import nl.tudelft.goal.ut2004.agent.UT2004BotBehavior;
36  import nl.tudelft.goal.ut2004.translators.CategoryTranslator;
37  import nl.tudelft.goal.ut2004.translators.ComboTranslator;
38  import nl.tudelft.goal.ut2004.translators.FireModeTranslator;
39  import nl.tudelft.goal.ut2004.translators.FlagStateTranslator;
40  import nl.tudelft.goal.ut2004.translators.GameTypeTranslator;
41  import nl.tudelft.goal.ut2004.translators.ItemTypeTranslator;
42  import nl.tudelft.goal.ut2004.translators.NavigationStateTranslator;
43  import nl.tudelft.goal.ut2004.translators.NoneTranslator;
44  import nl.tudelft.goal.ut2004.translators.PerceptTranslator;
45  import nl.tudelft.goal.ut2004.translators.SelectorListTranslator;
46  import nl.tudelft.goal.ut2004.translators.SelectorTranslator;
47  import nl.tudelft.goal.ut2004.translators.UnrealIdOrLocationTranslator;
48  import nl.tudelft.goal.ut2004.translators.WeaponPrefListTranslator;
49  import nl.tudelft.goal.ut2004.translators.WeaponPrefTranslator;
50  import nl.tudelft.goal.ut2004.visualizer.connection.AddBotCommand;
51  import nl.tudelft.goal.ut2004.visualizer.connection.EnvironmentServiceListener;
52  import nl.tudelft.goal.ut2004.visualizer.connection.EnvironmentServiceMediator;
53  import nl.tudelft.goal.ut2004.visualizer.connection.client.RemoteVisualizer;
54  import nl.tudelft.goal.ut2004.visualizer.connection.client.VisualizerServiceDefinition;
55  import nl.tudelft.pogamut.base.server.ReconnectingServerDefinition;
56  import cz.cuni.amis.pogamut.ut2004.bot.impl.UT2004BotController;
57  import cz.cuni.amis.utils.flag.FlagListener;
58  import eis.eis2java.handlers.ActionHandler;
59  import eis.eis2java.handlers.AllPerceptPerceptHandler;
60  import eis.eis2java.handlers.DefaultActionHandler;
61  import eis.eis2java.handlers.PerceptHandler;
62  import eis.eis2java.translation.Translator;
63  import eis.eis2java.util.AllPerceptsProvider;
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 		if (!(controller instanceof AllPerceptsProvider))
182 			throw new EntityException("Expected a class that implements " + AllPerceptsProvider.class.getSimpleName());
183 		return new AllPerceptPerceptHandler((AllPerceptsProvider) controller);
184 	}
185 
186 	@Override
187 	protected ActionHandler createActionHandler(UT2004BotController controller) throws EntityException {
188 		return new DefaultActionHandler(controller);
189 	}
190 
191 	@Override
192 	protected synchronized void initializeEnvironment(Map<String, Parameter> parameters) throws ManagementException {
193 		super.initializeEnvironment(parameters);
194 
195 		// Set up (future) connection to visualizer. Connecting is done later.
196 		try {
197 			visualizerConnection = new ReconnectingServerDefinition<RemoteVisualizer>(new VisualizerServiceDefinition());
198 			visualizerConnection.getServerFlag().addListener(new VisualizerServiceListener());
199 		} catch (RemoteException e) {
200 			log.severe("Could not start connection to Visualizer: " + e);
201 		}
202 
203 	}
204 
205 	/**
206 	 * Helper class that handles the connection to the visualizer. Registers a
207 	 * mediator with the visualizer and listens to the actions it requests.
208 	 * 
209 	 * @author M.P. Korstanje
210 	 * 
211 	 */
212 	private class VisualizerServiceListener implements EnvironmentServiceListener, FlagListener<RemoteVisualizer> {
213 
214 		private final EnvironmentServiceMediator mediator;
215 
216 		public VisualizerServiceListener() throws RemoteException {
217 			mediator = new EnvironmentServiceMediator(getComponentId());
218 			mediator.setListener(this);
219 		}
220 
221 		@Override
222 		public void flagChanged(RemoteVisualizer visualizer) {
223 			if (visualizer != null) {
224 				visualizer.setEnvironment(mediator);
225 			}
226 		}
227 
228 		/**
229 		 * 
230 		 * Listens to actions executed by the remote visualizer.
231 		 * 
232 		 * @throws ManagementException
233 		 * 
234 		 */
235 		@Override
236 		public void addBot(AddBotCommand command) throws ManagementException {
237 
238 			BotParameters parameters = new BotParameters(environmentLogger);
239 
240 			// Fill out the bot parameter
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.getSkill() != null) {
251 				parameters.setSkill(command.getSkill());
252 			}
253 			if (command.getSkin() != null) {
254 				parameters.setSkin(command.getSkin());
255 			}
256 			if (command.getTeam() != null) {
257 				parameters.setTeam(command.getTeam());
258 			}
259 
260 			if (command.getRotation() != null) {
261 				parameters.setInitialRotation(command.getRotation());
262 			}
263 
264 			if (command.getLocation() != null) {
265 				parameters.setInitialLocation(command.getLocation());
266 			}
267 
268 			// Take connection and other settings from init.
269 			parameters.assignDefaults(botParameters);
270 
271 			startAgents(parameters);
272 
273 		}
274 
275 	}
276 
277 	@Override
278 	protected synchronized void connectEnvironment() throws ManagementException {
279 		super.connectEnvironment();
280 
281 		// Connect to visualizer
282 		URI visualizerUri = environmentParameters.getVisualizerServer();
283 		if (visualizerUri != null) {
284 			log.info("Connecting to visualizer server at " + visualizerUri + " .");
285 
286 			visualizerConnection.setUri(visualizerUri);
287 		} else {
288 			log.info("No address for the visualizer server was provided. The environment will not try to connect to the visualizer.");
289 		}
290 	}
291 
292 	@Override
293 	protected synchronized void killEnvironment() {
294 		super.killEnvironment();
295 		// Close the connection to the visualizer.
296 		visualizerConnection.stopServer();
297 
298 	}
299 
300 }