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}