001/* 002 * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games. 003 * Copyright (C) 2000-2010 The Gridarta Developers. 004 * 005 * This program is free software; you can redistribute it and/or modify 006 * it under the terms of the GNU General Public License as published by 007 * the Free Software Foundation; either version 2 of the License, or 008 * (at your option) any later version. 009 * 010 * This program is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 013 * GNU General Public License for more details. 014 * 015 * You should have received a copy of the GNU General Public License along 016 * with this program; if not, write to the Free Software Foundation, Inc., 017 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 018 */ 019 020package net.sf.gridarta.model.mapcontrol; 021 022import java.io.File; 023import java.io.IOException; 024import net.sf.gridarta.model.archetype.DuplicateArchetypeException; 025import net.sf.gridarta.model.archetype.TestArchetype; 026import net.sf.gridarta.model.archetypechooser.ArchetypeChooserModel; 027import net.sf.gridarta.model.archetypeset.ArchetypeSet; 028import net.sf.gridarta.model.autojoin.AutojoinListsHelper; 029import net.sf.gridarta.model.exitconnector.ExitMatcher; 030import net.sf.gridarta.model.gameobject.TestGameObject; 031import net.sf.gridarta.model.io.DefaultMapReader; 032import net.sf.gridarta.model.io.DefaultMapWriter; 033import net.sf.gridarta.model.io.GameObjectParser; 034import net.sf.gridarta.model.io.MapArchObjectParserFactory; 035import net.sf.gridarta.model.io.MapReaderFactory; 036import net.sf.gridarta.model.io.MapWriter; 037import net.sf.gridarta.model.io.PathManager; 038import net.sf.gridarta.model.io.TestMapArchObjectParserFactory; 039import net.sf.gridarta.model.io.TestMapReaderFactory; 040import net.sf.gridarta.model.maparchobject.MapArchObjectFactory; 041import net.sf.gridarta.model.maparchobject.TestMapArchObject; 042import net.sf.gridarta.model.maparchobject.TestMapArchObjectFactory; 043import net.sf.gridarta.model.mapmanager.AbstractMapManager; 044import net.sf.gridarta.model.mapmanager.DefaultMapManager; 045import net.sf.gridarta.model.mapmanager.FileControl; 046import net.sf.gridarta.model.mapmanager.MapManager; 047import net.sf.gridarta.model.mapmanager.TestFileControl; 048import net.sf.gridarta.model.mapmodel.InsertionModeSet; 049import net.sf.gridarta.model.mapmodel.MapModelFactory; 050import net.sf.gridarta.model.mapmodel.TestMapModelCreator; 051import net.sf.gridarta.model.mapmodel.TestMapModelHelper; 052import net.sf.gridarta.model.match.GameObjectMatcher; 053import net.sf.gridarta.model.match.TypeNrsGameObjectMatcher; 054import net.sf.gridarta.model.settings.ProjectSettings; 055import net.sf.gridarta.model.settings.TestProjectSettings; 056import net.sf.gridarta.utils.Size2D; 057import org.jetbrains.annotations.NotNull; 058import org.jetbrains.annotations.Nullable; 059 060/** 061 * Helper class for creating {@link MapControl} instances for regression tests. 062 * @author Andreas Kirschbaum 063 */ 064public class TestMapControlCreator { 065 066 /** 067 * The {@link MapManager} instance. 068 */ 069 @NotNull 070 private final MapManager<TestGameObject, TestMapArchObject, TestArchetype> mapManager; 071 072 /** 073 * The pickmap {@link MapManager} instance. 074 */ 075 @NotNull 076 private final MapManager<TestGameObject, TestMapArchObject, TestArchetype> pickmapManager; 077 078 /** 079 * The {@link PathManager} instance. 080 */ 081 @NotNull 082 private final PathManager pathManager; 083 084 /** 085 * The {@link ExitMatcher} instance. 086 */ 087 @NotNull 088 private final ExitMatcher<TestGameObject, TestMapArchObject, TestArchetype> exitMatcher; 089 090 /** 091 * The {@link MapArchObjectParserFactory} instance. 092 */ 093 @NotNull 094 private final MapArchObjectParserFactory<TestMapArchObject> mapArchObjectParserFactory; 095 096 /** 097 * The {@link GameObjectParser} instance. 098 */ 099 @NotNull 100 private final GameObjectParser<TestGameObject, TestMapArchObject, TestArchetype> gameObjectParser; 101 102 /** 103 * The {@link MapReaderFactory} instance. 104 */ 105 @NotNull 106 private final MapReaderFactory<TestGameObject, TestMapArchObject> mapReaderFactory; 107 108 /** 109 * The {@link ProjectSettings} instance. 110 */ 111 @NotNull 112 private final ProjectSettings projectSettings; 113 114 /** 115 * The {@link MapArchObjectFactory} instance. 116 */ 117 @NotNull 118 private final MapArchObjectFactory<TestMapArchObject> mapArchObjectFactory = new TestMapArchObjectFactory(); 119 120 /** 121 * The {@link FileControl} instance. 122 */ 123 @NotNull 124 private final FileControl<TestGameObject, TestMapArchObject, TestArchetype> fileControl = new TestFileControl(); 125 126 /** 127 * The {@link MapModelFactory} instance. 128 */ 129 @NotNull 130 private final MapModelFactory<TestGameObject, TestMapArchObject, TestArchetype> mapModelFactory; 131 132 /** 133 * The {@link MapControlFactory} instance. 134 */ 135 @NotNull 136 private final MapControlFactory<TestGameObject, TestMapArchObject, TestArchetype> mapControlFactory; 137 138 /** 139 * The {@link TestMapModelCreator} instance. 140 */ 141 @NotNull 142 private final TestMapModelCreator mapModelCreator = new TestMapModelCreator(false); 143 144 /** 145 * The {@link MapWriter} instance. 146 */ 147 @NotNull 148 private final MapWriter<TestGameObject, TestMapArchObject, TestArchetype> mapWriter; 149 150 /** 151 * Creates a new instance. 152 */ 153 public TestMapControlCreator() { 154 final GameObjectMatcher exitGameObjectMatcher = new TypeNrsGameObjectMatcher(TestMapModelHelper.EXIT_TYPE); 155 exitMatcher = new ExitMatcher<TestGameObject, TestMapArchObject, TestArchetype>(exitGameObjectMatcher); 156 mapArchObjectParserFactory = new TestMapArchObjectParserFactory(); 157 gameObjectParser = mapModelCreator.newGameObjectParser(); 158 mapReaderFactory = new TestMapReaderFactory(mapArchObjectParserFactory, mapArchObjectFactory, gameObjectParser); 159 projectSettings = new TestProjectSettings(); 160 mapWriter = new DefaultMapWriter<TestGameObject, TestMapArchObject, TestArchetype>(mapArchObjectParserFactory, gameObjectParser); 161 final ArchetypeChooserModel<TestGameObject, TestMapArchObject, TestArchetype> archetypeChooserModel = new ArchetypeChooserModel<TestGameObject, TestMapArchObject, TestArchetype>(); 162 pathManager = new PathManager(projectSettings); 163 mapModelFactory = new MapModelFactory<TestGameObject, TestMapArchObject, TestArchetype>(archetypeChooserModel, mapModelCreator.getAutojoinLists(), mapModelCreator.getGameObjectFactory(), mapModelCreator.getGameObjectMatchers(), mapModelCreator.getTopmostInsertionMode()); 164 mapControlFactory = new TestMapControlFactory(mapWriter, projectSettings, mapModelFactory); 165 final AbstractMapManager<TestGameObject, TestMapArchObject, TestArchetype> tmpMapManager = new DefaultMapManager<TestGameObject, TestMapArchObject, TestArchetype>(mapReaderFactory, mapControlFactory, projectSettings, mapModelCreator.getFaceObjectProviders()); 166 tmpMapManager.setFileControl(fileControl); 167 mapManager = tmpMapManager; 168 final AbstractMapManager<TestGameObject, TestMapArchObject, TestArchetype> tmpPickmapManager = new DefaultMapManager<TestGameObject, TestMapArchObject, TestArchetype>(mapReaderFactory, mapControlFactory, projectSettings, mapModelCreator.getFaceObjectProviders()); 169 tmpPickmapManager.setFileControl(fileControl); 170 pickmapManager = tmpPickmapManager; 171 } 172 173 /** 174 * Creates a new {@link TestMapModelHelper} instance. 175 * @return the new instance 176 * @throws DuplicateArchetypeException if an internal error occurs 177 */ 178 public TestMapModelHelper newMapModelCreator() throws DuplicateArchetypeException { 179 return mapModelCreator.newTestMapModelHelper(); 180 } 181 182 /** 183 * Creates a new map control. 184 * @param mapFile the map file 185 * @param mapName the map name 186 * @param mapSize the map size 187 * @return the map control 188 */ 189 public MapControl<TestGameObject, TestMapArchObject, TestArchetype> newMapControl(@Nullable final File mapFile, @NotNull final String mapName, @NotNull final Size2D mapSize) { 190 final TestMapArchObject mapArchObject = mapArchObjectFactory.newMapArchObject(false); 191 mapArchObject.setMapSize(mapSize); 192 mapArchObject.setMapName(mapName); 193 return mapManager.newMap(null, mapArchObject, mapFile, true); 194 } 195 196 /** 197 * Returns the {@link PathManager}. 198 * @return the path manager 199 */ 200 @NotNull 201 public PathManager getPathManager() { 202 return pathManager; 203 } 204 205 /** 206 * Returns the {@link ProjectSettings}. 207 * @return the project settings 208 */ 209 @NotNull 210 public ProjectSettings getProjectSettings() { 211 return projectSettings; 212 } 213 214 /** 215 * Returns the {@link ExitMatcher}. 216 * @return the exit matcher 217 */ 218 @NotNull 219 public ExitMatcher<TestGameObject, TestMapArchObject, TestArchetype> getExitMatcher() { 220 return exitMatcher; 221 } 222 223 /** 224 * Returns the {@link ArchetypeSet}. 225 * @return the archetype set 226 */ 227 @NotNull 228 public ArchetypeSet<TestGameObject, TestMapArchObject, TestArchetype> getArchetypeSet() { 229 return mapModelCreator.getArchetypeSet(); 230 } 231 232 /** 233 * Returns the {@link MapManager}. 234 * @return the map manager 235 */ 236 @NotNull 237 public MapManager<TestGameObject, TestMapArchObject, TestArchetype> getMapManager() { 238 return mapManager; 239 } 240 241 /** 242 * Returns the {@link InsertionModeSet}. 243 * @return the insertion mode set 244 */ 245 @NotNull 246 public InsertionModeSet<TestGameObject, TestMapArchObject, TestArchetype> getInsertionModeSet() { 247 return mapModelCreator.getInsertionModeSet(); 248 } 249 250 /** 251 * Returns the {@link FileControl} instance. 252 * @return the file control instance 253 */ 254 @NotNull 255 public FileControl<TestGameObject, TestMapArchObject, TestArchetype> getFileControl() { 256 return fileControl; 257 } 258 259 /** 260 * Returns a new {@link AutojoinListsHelper} instance. 261 * @return the autojoin lists helper instance 262 */ 263 @NotNull 264 public AutojoinListsHelper newAutojoinListsHelper() { 265 return new AutojoinListsHelper(mapModelCreator); 266 } 267 268 /** 269 * Returns the {@link TestMapModelCreator} instance. 270 * @return the test map model creator instance 271 */ 272 @NotNull 273 public TestMapModelCreator getMapModelCreator() { 274 return mapModelCreator; 275 } 276 277 /** 278 * Returns a new {@link MapManager} instance. 279 * @return the map manager instance 280 */ 281 @NotNull 282 public MapManager<TestGameObject, TestMapArchObject, TestArchetype> newMapManager() { 283 return new DefaultMapManager<TestGameObject, TestMapArchObject, TestArchetype>(mapReaderFactory, mapControlFactory, projectSettings, mapModelCreator.getFaceObjectProviders()); 284 } 285 286 /** 287 * Returns the {@link MapArchObjectFactory} instance. 288 * @return the test map arch object factory instance 289 */ 290 @NotNull 291 public MapArchObjectFactory<TestMapArchObject> getMapArchObjectFactory() { 292 return mapArchObjectFactory; 293 } 294 295 /** 296 * Returns the {@link MapModelFactory} instance. 297 * @return the test map model factory instance 298 */ 299 @NotNull 300 public MapModelFactory<TestGameObject, TestMapArchObject, TestArchetype> getMapModelFactory() { 301 return mapModelFactory; 302 } 303 304 /** 305 * Returns the {@link MapManager pickmap manager} instance. 306 * @return the pickmap manager instance 307 */ 308 @NotNull 309 public MapManager<TestGameObject, TestMapArchObject, TestArchetype> getPickmapManager() { 310 return pickmapManager; 311 } 312 313 /** 314 * Returns the {@link MapWriter} instance. 315 * @return the map writer instance 316 */ 317 @NotNull 318 public MapWriter<TestGameObject, TestMapArchObject, TestArchetype> getMapWriter() { 319 return mapWriter; 320 } 321 322 /** 323 * Creates a new instance. 324 * @param mapFile the file to pass to the map reader constructor 325 * @return the map reader instance 326 * @throws IOException if the map reader cannot be created 327 */ 328 @NotNull 329 public DefaultMapReader<TestGameObject, TestMapArchObject, TestArchetype> newMapReader(@NotNull final File mapFile) throws IOException { 330 return new DefaultMapReader<TestGameObject, TestMapArchObject, TestArchetype>(mapArchObjectParserFactory, mapArchObjectFactory, gameObjectParser, mapFile); 331 } 332 333}