package vooga.towerdefense.gameeditor.gameloader.xmlloaders;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.w3c.dom.Element;
import util.XMLTool;
import vooga.towerdefense.controller.Controller;
import vooga.towerdefense.factories.elementfactories.GameElementFactory;
import vooga.towerdefense.factories.waveactionfactories.WaveActionFactory;
import vooga.towerdefense.model.GameMap;
import vooga.towerdefense.model.GameModel;
import vooga.towerdefense.model.Player;
import vooga.towerdefense.model.levels.Level;
import vooga.towerdefense.model.rules.Rule;
import vooga.towerdefense.view.TDView;
/**
* GameLoader loads in the information from the XML file and
* starts the game.
*
* @author Angelica Schwartz
*/
public class GameLoader {
private XMLTool myXMLTool;
private Map<String, GameElementFactory> gameElements;
public GameLoader(String xmlFilePath) {
myXMLTool = new XMLTool(xmlFilePath);
gameElements = new HashMap<String, GameElementFactory>();
}
public List<GameMap> loadMaps() {
MapXMLLoader mapLoader = new MapXMLLoader(myXMLTool);
List<GameMap> maps = mapLoader.loadMaps();
return maps;
}
public TDView loadView(TDView view, Controller controller) throws IllegalArgumentException, ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException {
ViewXMLLoader loader = new ViewXMLLoader(myXMLTool);
return loader.makeView(view, controller);
}
public Player loadPlayer(Controller controller) {
PlayerXMLLoader loader = new PlayerXMLLoader(myXMLTool);
return loader.loadPlayer(controller);
}
public List<GameElementFactory> loadElements(GameMap map, Player player) {
GameElementXMLLoader loader = new GameElementXMLLoader(myXMLTool);
//TODO: Fix this
WaveActionFactory.ourGEFactories = loader.loadGameElementFactories(map, player);
List<GameElementFactory> gameElementFactoryList = new ArrayList<GameElementFactory>(WaveActionFactory.ourGEFactories.values());
for (GameElementFactory factory : WaveActionFactory.ourGEFactories.values()) {
factory.initialize(map, gameElementFactoryList);
}
return new ArrayList<GameElementFactory>(WaveActionFactory.ourGEFactories.values());
}
public List<Level> loadLevels(GameModel model, GameMap gameMap, Player player) {
LevelsXMLLoader loader = new LevelsXMLLoader(myXMLTool);
return loader.loadLevels(model, gameMap, player);
}
public List<Rule> loadRules(GameModel model) {
Element rulesElement = myXMLTool.getElement("rules");
RulesXMLLoader loader = new RulesXMLLoader(myXMLTool);
return loader.getRules(model, rulesElement);
}
public void startGame(Controller controller) {
controller.start();
}
public Map<String, GameElementFactory> getGEFactoryMap() {
return gameElements;
}
}