package core; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import core.DungeonConstants.Tile; public class GridMapper { private String filename; private PrintWriter writer; private BufferedReader reader; private int sizeOfSquare; private String svgStart1, svgStart2; public GridMapper(String filename, int sizeOfSquare) { this.filename = filename; try { this.reader = new BufferedReader(new FileReader(filename)); } catch (FileNotFoundException e) { e.printStackTrace(); } try { this.writer = new PrintWriter(DungeonConstants.SAVEDDUNGEONSDIR + "//generatedDungeon.svg", "UTF-8"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } this.svgStart1 = "<svg xmlns=\"http://www.w3.org/2000/svg\" "; this.svgStart2 = "xmlns:xlink=\"http://www.w3.org/1999/xlink\">"; //TODO: make this configurable this.sizeOfSquare = sizeOfSquare; } public boolean generateSVG() { String imageSize = "height=\""; imageSize += Integer.toString(this.sizeOfSquare * this.sizeOfSquare); imageSize += "\" width=\""; imageSize += Integer.toString(this.sizeOfSquare * this.sizeOfSquare); imageSize += "\" "; int sizeOfStep = this.sizeOfSquare / 6; this.writer.print(this.svgStart1); this.writer.print(imageSize); this.writer.println(this.svgStart2); this.writer.println("<defs>\n<g id = \"downstairs\">"); this.writer.print("<rect x=\"0\" y=\"0\" width=\""); this.writer.print(this.sizeOfSquare + "\" height=\""); this.writer.print(this.sizeOfSquare + "\" style=\"fill:tan;stroke:black;stroke-width:" + sizeOfStep); this.writer.println(";fill-opacity:1;stroke-opacity:0.9\"/>"); for (int i = 1; i < 5; i++) { this.writer.print("<line x1=\""); this.writer.print(sizeOfStep*i + "\" y1=\"" + sizeOfStep*i + "\" x2=\""); this.writer.println(sizeOfStep*(i+1) + "\" y2=\"" + sizeOfStep*i + "\" style=\"stroke:black;stroke-width:2\" />"); this.writer.print("<line x1=\"" + sizeOfStep*(i+1) + "\" y1=\"" + sizeOfStep*i); this.writer.println("\" x2=\"" + sizeOfStep*(i+1) + "\" y2=\"" + sizeOfStep*(i+1) + "\" style=\"stroke:black;stroke-width:2\" />"); } this.writer.println("</g>"); this.writer.println("<g id = \"unpassableTerrain\">"); this.writer.print("<rect x=\"0\" y=\"0\" width=\"" + this.sizeOfSquare); this.writer.print("\" height=\"" + this.sizeOfSquare + "\" style=\"fill:rgb(123,105,93);stroke:black;stroke-width:"); this.writer.print(sizeOfStep + ";fill-opacity:1;stroke-opacity:0.9\"/>"); this.writer.println("</g>"); this.writer.println("<g id = \"passableTerrain\">\n"); this.writer.print("<rect x=\"0\" y=\"0\" width=\"" + this.sizeOfSquare); this.writer.print("\" height=\"" + this.sizeOfSquare + "\" style=\"fill:white;stroke:black;stroke-width:"); this.writer.println(sizeOfStep + ";fill-opacity:1;stroke-opacity:0.9\"/>"); this.writer.println("</g>"); this.writer.println("</defs>"); int size; String line; try { line = this.reader.readLine(); size = Integer.parseInt(line); String svgLine = ""; for (int i = 0; i < size; i++) { line = this.reader.readLine(); int counter = 0; for (String s: line.split(", ")) { switch (s) { case "X": svgLine = generateLine(Tile.Unpassable, counter*this.sizeOfSquare, i*this.sizeOfSquare); break; case "_": svgLine = generateLine(Tile.Passable, counter*this.sizeOfSquare, i*this.sizeOfSquare); break; case "S": svgLine = generateLine(Tile.Downstairs, counter*this.sizeOfSquare, i*this.sizeOfSquare); break; case "U": svgLine = generateLine(Tile.Upstairs, counter*this.sizeOfSquare, i*this.sizeOfSquare); break; default: break; } counter++; this.writer.println(svgLine); } } } catch (Exception e) { e.printStackTrace(); return false; } this.writer.println("</svg>"); this.writer.close(); return true; } public void setSizeOfSquare(int newSize) { this.sizeOfSquare = newSize; } public String generateLine(Tile tileType, int x, int y) { String retStr = "<use xlink:href=\""; switch (tileType) { case Passable: retStr += "#passableTerrain\""; break; case Unpassable: retStr += "#unpassableTerrain\""; break; case Downstairs: retStr += "#downstairs\""; break; case Upstairs: retStr += "#downstairs\""; //TODO: fix this. break; default: System.out.println(tileType); break; } retStr += " x=\"" + Integer.toString(x) + "\" y=\"" + Integer.toString(y) + "\" />"; return retStr; } }