package vooga.towerdefense.gameeditor.gameloader.xmlloaders; import java.awt.Dimension; import java.util.HashMap; import java.util.List; import java.util.Map; import org.w3c.dom.Element; import vooga.towerdefense.util.Pixmap; import util.XMLTool; import vooga.towerdefense.factories.actionfactories.ActionFactory; import vooga.towerdefense.factories.attributefactories.AttributeFactory; import vooga.towerdefense.factories.attributefactories.AttributeManagerFactory; import vooga.towerdefense.factories.elementfactories.GameElementFactory; import vooga.towerdefense.model.GameMap; import vooga.towerdefense.model.Player; /** * This class is responsible for loading GameElementFactory * objects from an XML file. * * @author Erick Gonzalez */ public class GameElementXMLLoader { private static final String IMAGE_PATH = "/vooga/towerdefense/images/"; private static final String GAME_ELEMENTS_TAG = "gameelements"; private static final String ATTRIBUTES_TAG = "attributes"; private static final String IMAGE_TAG = "image"; private static final String TYPE_TAG = "type"; private static final String DIMENSION_TAG = "dimension"; private static final String ACTIONS_TAG = "actions"; private XMLTool myXMLTool; /** * * @param xmlTool an xml tool containing the xml document */ public GameElementXMLLoader(XMLTool xmlTool) { myXMLTool = xmlTool; } /** * Loads a map from GameElementFactory name to GameElementFactory objects. * * @param map a game map * @param player a player object * @return a map from the name of a GameElementFactory to its object */ public Map<String, GameElementFactory> loadGameElementFactories (GameMap map, Player player) { //TODO: This needs to be passed in as a parameter Element gameElementsElement = myXMLTool.getElement(GAME_ELEMENTS_TAG); List<Element> subElements = myXMLTool.getChildrenList(gameElementsElement); Map<String, GameElementFactory> gameElementFactories = new HashMap<String, GameElementFactory>(); for (Element subElement : subElements) { gameElementFactories.put(myXMLTool.getTagName(subElement), loadGameElementFactory(subElement, map, player)); } return gameElementFactories; } private GameElementFactory loadGameElementFactory (Element gameElement, GameMap map, Player player) { Map<String, Element> subElementMap = myXMLTool.getChildrenElementMap(gameElement); String gameElementName = myXMLTool.getTagName(gameElement); String gameElementType = loadType(subElementMap.get(TYPE_TAG)); Pixmap elementImage = loadElementImage(subElementMap.get(IMAGE_TAG)); Dimension elementDimension = loadDimension(subElementMap.get(DIMENSION_TAG)); AttributeFactoryXMLLoader attributeLoader = new AttributeFactoryXMLLoader(myXMLTool); List<AttributeFactory> attributeFactories = attributeLoader.loadAttributeFactories(subElementMap.get(ATTRIBUTES_TAG)); ActionXMLLoader loader = new ActionXMLLoader(myXMLTool); List<ActionFactory> actionFactories = loader. loadActionFactories(subElementMap.get(ACTIONS_TAG), map, player); AttributeManagerFactory managerFactory = new AttributeManagerFactory(attributeFactories); GameElementFactory geFactory = new GameElementFactory(gameElementName, gameElementType, elementImage, elementDimension, managerFactory, actionFactories); return geFactory; } private Pixmap loadElementImage (Element imageElement) { String imageName = myXMLTool.getContent(imageElement); return new Pixmap(IMAGE_PATH + imageName); } private String loadType (Element typeElement) { return myXMLTool.getContent(typeElement); } private Dimension loadDimension(Element dimensionElement) { String dimensionString = myXMLTool.getContent(dimensionElement); String[] dimensionStringArray = dimensionString.split(",\\s+"); return new Dimension(Integer.parseInt(dimensionStringArray[0]), Integer.parseInt(dimensionStringArray[1])); } }