184 lines
7.0 KiB
Java
184 lines
7.0 KiB
Java
package cicaprojekt;
|
|
|
|
import java.io.*;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
public class Dungeon {
|
|
/* NOTE: this function assumes that the parameter input is a well-formatted dungeon file.
|
|
* Such file looks like as follows:
|
|
*
|
|
* <map width>x<map height>
|
|
* <empty line>
|
|
* <map matrix line 1>
|
|
* ...
|
|
* ...
|
|
* <map matrix line <map height>>
|
|
* <empty line>
|
|
* <scale y>-<scale x>-<gate y>-<gate x>-<scale trigger weight>
|
|
* ...
|
|
* ...
|
|
* <scale y>-<scale x>-<gate y>-<gate x>-<scale trigger weight>
|
|
*
|
|
* where the map matrix is a matrix of the following chars:
|
|
* W: Wall
|
|
* F: Field
|
|
* Z: Field with a ZMP
|
|
* B: Field with a Box
|
|
* O: Field with ONeill
|
|
* J: Field with Jaffa
|
|
* G: Gate
|
|
* S: Scale
|
|
* X: Gap
|
|
* R: Replicator */
|
|
Map<String, Tile> buildDungeon(File input, Display display) throws IOException
|
|
{
|
|
Tile defaultTile = new Field();
|
|
defaultTile.setX(-666);
|
|
defaultTile.setY(-666);
|
|
|
|
Tile oneilllocation = defaultTile;
|
|
Tile jaffalocation = defaultTile;
|
|
Tile replicatorlocation = defaultTile;
|
|
try(BufferedReader reader = new BufferedReader(new FileReader(input)))
|
|
{
|
|
String[] sizedata = reader.readLine().split("x"); // read size data at beginning of file
|
|
reader.readLine(); // throw empty line away
|
|
int width = Integer.parseInt(sizedata[0]);
|
|
int height = Integer.parseInt(sizedata[1]);
|
|
|
|
Tile[][] dungeon = new Tile[width][height];
|
|
|
|
String line = null;
|
|
Gate tempgate = new Gate();
|
|
Scale tempscale = new Scale(tempgate, Integer.MAX_VALUE);
|
|
int scalecount = 0;
|
|
for (int y = 0; y < height; ++y)
|
|
{
|
|
line = reader.readLine().replaceAll("\\s",""); // read line and remove whitespaces
|
|
for (int x = 0; x < width; ++x)
|
|
{
|
|
Tile tile = null;
|
|
switch (line.charAt(x)) // set the dungeon up
|
|
{
|
|
case 'W':
|
|
tile = new Wall();
|
|
display.addVisual(new WallDrawer((Wall) tile));
|
|
break;
|
|
|
|
case 'F':
|
|
tile = new Field();
|
|
display.addVisual(new FieldDrawer((Field) tile));
|
|
break;
|
|
|
|
case 'Z':
|
|
tile = new Field();
|
|
display.addVisual(new FieldDrawer((Field) tile));
|
|
tile.setZPMOnTile(new ZPM());
|
|
break;
|
|
|
|
case 'B':
|
|
tile = new Field();
|
|
display.addVisual(new FieldDrawer((Field) tile));
|
|
tile.putABox(new Box());
|
|
break;
|
|
|
|
case 'O':
|
|
tile = new Field();
|
|
display.addVisual(new FieldDrawer((Field) tile));
|
|
oneilllocation = tile;
|
|
break;
|
|
|
|
case 'J':
|
|
tile = new Field();
|
|
display.addVisual(new FieldDrawer((Field) tile));
|
|
jaffalocation = tile;
|
|
break;
|
|
|
|
case 'G':
|
|
tile = tempgate;
|
|
break;
|
|
|
|
case 'S':
|
|
tile = tempscale;
|
|
scalecount++;
|
|
break;
|
|
|
|
case 'X':
|
|
tile = new Gap();
|
|
display.addVisual(new GapDrawer((Gap) tile));
|
|
break;
|
|
|
|
case 'R':
|
|
tile = new Field();
|
|
display.addVisual(new FieldDrawer((Field) tile));
|
|
replicatorlocation = tile;
|
|
break;
|
|
}
|
|
tile.setY(y); tile.setX(x);
|
|
dungeon[y][x] = tile;
|
|
}
|
|
}
|
|
|
|
reader.readLine(); // throw empty line away
|
|
|
|
for (int i = 0; i < scalecount; ++i) // set up scale-gate connections
|
|
{
|
|
String[] scaledata = reader.readLine().split("-");
|
|
|
|
int sy = Integer.parseInt(scaledata[0]);
|
|
int sx = Integer.parseInt(scaledata[1]);
|
|
int gy = Integer.parseInt(scaledata[2]);
|
|
int gx = Integer.parseInt(scaledata[3]);
|
|
int triggerweight = Integer.parseInt(scaledata[4]);
|
|
|
|
Gate gate = new Gate();
|
|
display.addVisual(new GateDrawer(gate));
|
|
gate.setY(gy);
|
|
gate.setX(gx);
|
|
|
|
Scale scale = new Scale(gate, triggerweight);
|
|
display.addVisual(new ScaleDrawer(scale));
|
|
scale.setY(sy);
|
|
scale.setX(sx);
|
|
|
|
dungeon[gy][gx] = gate;
|
|
dungeon[sy][sx] = scale;
|
|
}
|
|
|
|
/* setting up Tile cross references */
|
|
for (int y = 0; y < height; ++y)
|
|
{
|
|
for (int x = 0; x < width; ++x)
|
|
{
|
|
if (x-1 >= 0) // leftwards Tile reference
|
|
dungeon[y][x].setAdajacentTile(dungeon[y][x-1], Direction.WEST);
|
|
else
|
|
dungeon[y][x].setAdajacentTile(null, Direction.WEST);
|
|
|
|
if (x+1 < width) // rightwards Tile reference
|
|
dungeon[y][x].setAdajacentTile(dungeon[y][x+1], Direction.EAST);
|
|
else
|
|
dungeon[y][x].setAdajacentTile(null, Direction.EAST);
|
|
|
|
if (y+1 < height) // upwards Tile reference
|
|
dungeon[y][x].setAdajacentTile(dungeon[y+1][x], Direction.NORTH);
|
|
else
|
|
dungeon[y][x].setAdajacentTile(null, Direction.NORTH);
|
|
|
|
if (y-1 >= 0) // downwards Tile reference
|
|
dungeon[y][x].setAdajacentTile(dungeon[y-1][x], Direction.SOUTH);
|
|
else
|
|
dungeon[y][x].setAdajacentTile(null, Direction.SOUTH);
|
|
}
|
|
}
|
|
}
|
|
|
|
Map<String, Tile> playermap = new HashMap<>();
|
|
playermap.put("oneill", oneilllocation);
|
|
playermap.put("jaffa", jaffalocation);
|
|
playermap.put("replicator", replicatorlocation);
|
|
|
|
return playermap;
|
|
}
|
|
} |