package toritools.io; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.io.File; import java.io.FileNotFoundException; import java.util.HashMap; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import toritools.entity.Entity; import toritools.entity.Level; import toritools.entity.ReservedTypes; import toritools.entity.sprite.AbstractSprite.AbstractSpriteAdapter; import toritools.entity.sprite.ImageSprite; import toritools.map.ToriMapIO; import toritools.map.VariableCase; import toritools.math.Vector2; import toritools.xml.ToriXML; public class Importer { /** * Imports the entity template. Sets basic template stuff. * * @param file * @return * @throws FileNotFoundException */ public static Entity importEntity(final File file, final HashMap<String, String> instanceMap) throws FileNotFoundException { VariableCase entityMap = ToriMapIO.readVariables(file); if (instanceMap != null) entityMap.getVariables().putAll(instanceMap); Entity e = new Entity(); e.getVariableCase().getVariables().putAll(entityMap.getVariables()); e.setFile(file.getPath().replace("\\", "/")); /** * Extract the basic template data. */ // DIMENSION try { e.setDim(new Vector2(Float.parseFloat(entityMap.getVar("dimensions.x")), Float.parseFloat(entityMap .getVar("dimensions.y")))); } catch (Exception er) { e.setDim(new Vector2()); } // SOLID try { e.setSolid(Boolean.parseBoolean(entityMap.getVar("solid").trim())); } catch (Exception er) { e.setSolid(false); } // ID String id; if ((id = entityMap.getVar("id")) != null) { e.getVariableCase().setVar("id", id); } // TITLE e.setType(entityMap.getVar("type")); if (e.getType() == null) e.setType("DEFAULT"); String inGame = entityMap.getVar("sprite.sheet"); if (inGame != null) { // The key is sprite but not editor String[] value = inGame.split(","); int x = 1, y = 1; if (value.length != 1) { x = Integer.parseInt(value[1].trim()); y = Integer.parseInt(value[2].trim()); } // 0: file, 1: x tile, 2: y tile File spriteFile = new File(file.getParent().replace("\\", "/") + "/" + value[0].trim()); if (spriteFile.canRead()) { e.setSprite(new ImageSprite(spriteFile, x, y)); } inGame = entityMap.getVar("sprite.timeScale"); if (inGame != null) { e.getSprite().setTimeStretch(Integer.parseInt(inGame.trim())); } } inGame = entityMap.getVar("sprite.sizeOffset"); if (inGame != null) { e.getSprite().setsizeOffset(Integer.parseInt(inGame.trim())); } inGame = entityMap.getVar("visible"); if (inGame != null) { e.setVisible(Boolean.parseBoolean(inGame.trim())); } return e; } public static Level importLevel(final File file) throws FileNotFoundException { Level level = new Level(); Document doc = ToriXML.parse(file); HashMap<String, String> props = ToriMapIO.readMap(doc.getElementsByTagName("level").item(0).getAttributes() .getNamedItem("map").getNodeValue()); level.getVariableCase().setVariables(props); if (level.getVariableCase().getVar("dimensions.x") == null) { level.setDim(new Vector2(1000, 1000)); level.getVariableCase().setVar("dimensions.x", "" + 1000); level.getVariableCase().setVar("dimensions.y", "" + 1000); } else { level.setDim(new Vector2(level.getVariableCase().getFloat("dimensions.x"), level.getVariableCase() .getFloat("dimensions.y"))); } // Extract level instance info // levelSize.width = Integer.parseInt(props.get("width")); // levelSize.height = Integer.parseInt(props.get("height")); File workingDirectory = file.getParentFile(); NodeList entities = doc.getElementsByTagName("entity"); for (int i = 0; i < entities.getLength(); i++) { Node e = entities.item(i); HashMap<String, String> mapData = ToriMapIO.readMap(e.getAttributes().getNamedItem("map").getNodeValue()); // int layer = Integer.parseInt(mapData.get("layer")); float x = Float.parseFloat(mapData.get("position.x")); float y = Float.parseFloat(mapData.get("position.y")); if (mapData.get("type") != null && mapData.get("type").equals(ReservedTypes.WALL.toString())) { float w = Float.parseFloat(mapData.get("dimensions.x")); float h = Float.parseFloat(mapData.get("dimensions.y")); Entity wall = makeWall(new Vector2(x, y), new Vector2(w, h)); wall.setLayer(Integer.parseInt(mapData.get("layer"))); wall.getVariableCase().getVariables().putAll(mapData); level.spawnEntity(wall); } else if (mapData.get("type") != null && mapData.get("type").equals(ReservedTypes.BACKGROUND.toString())) { float w = Float.parseFloat(mapData.get("dimensions.x")); float h = Float.parseFloat(mapData.get("dimensions.y")); File imageFile = new File((workingDirectory + mapData.get("image")).replace("\\", "/")); int xTile = Integer.parseInt(mapData.get("xTile")); int yTile = Integer.parseInt(mapData.get("yTile")); int xTiles = Integer.parseInt(mapData.get("xTiles")); int yTiles = Integer.parseInt(mapData.get("yTiles")); Entity background = makeBackground(new Vector2(x, y), new Vector2(w, h), imageFile, mapData.get("image"), xTile, yTile, xTiles, yTiles); background.setLayer(Integer.parseInt(mapData.get("layer"))); background.getVariableCase().getVariables().putAll(mapData); level.spawnEntity(background); } else { File f = new File(workingDirectory + mapData.get("template")); Entity ent = importEntity(f, mapData); ent.setPos(new Vector2((float) x, (float) y)); ent.setLayer(Integer.parseInt(mapData.get("layer"))); // layerEditor.setLayerVisibility(layer, true); ent.getVariableCase().getVariables().putAll(mapData); ent.setFile(f.getPath().replace("\\", "/")); level.spawnEntity(ent); } } return level; } public static Entity makeBackground(final Vector2 pos, final Vector2 dim, final File image, final String relativeLink, final int x, final int y, final int xTiles, final int yTiles) { Entity bg = new Entity(); bg.setPos(pos); bg.setDim(dim); bg.getVariableCase().setVar("xTiles", xTiles + ""); bg.getVariableCase().setVar("yTiles", yTiles + ""); bg.getVariableCase().setVar("xTile", x + ""); bg.getVariableCase().setVar("yTile", y + ""); bg.getVariableCase().setVar("image", relativeLink); bg.getVariableCase().setVar("dimensions.x", dim.x + ""); bg.getVariableCase().setVar("dimensions.y", dim.y + ""); bg.setType(ReservedTypes.BACKGROUND); bg.getVariableCase().setVar("type", bg.getType()); bg.setSprite(new ImageSprite(image, xTiles, yTiles)); bg.getSprite().setFrame(x); bg.getSprite().setCycle(y); return bg; } public static Entity makeWall(final Vector2 pos, final Vector2 dim) { Entity wall = new Entity(); wall.setPos(pos); wall.setDim(dim); wall.getVariableCase().setVar("dimensions.x", dim.x + ""); wall.getVariableCase().setVar("dimensions.y", dim.y + ""); wall.setSolid(true); wall.getVariableCase().setVar("solid", "true"); wall.setType(ReservedTypes.WALL); wall.getVariableCase().setVar("type", ReservedTypes.WALL); wall.setVisible(false); wall.getVariableCase().setVar("visible", "false"); wall.setSprite(new AbstractSpriteAdapter() { @Override public void draw(final Graphics2D g, final Entity self) { g.setStroke(new BasicStroke(2)); g.setColor(Color.RED); g.drawLine(self.getPos().getWidth(), self.getPos().getHeight(), self.getPos().getWidth() + self.getDim().getWidth(), self.getPos().getHeight() + self.getDim().getHeight()); g.drawLine(self.getPos().getWidth(), self.getPos().getHeight() + self.getDim().getHeight(), self .getPos().getWidth() + self.getDim().getWidth(), self.getPos().getHeight()); g.draw3DRect(self.getPos().getWidth(), self.getPos().getHeight(), self.getDim().getWidth(), self .getDim().getHeight(), true); } }); return wall; } }