package dev.llan.model.board.generation;
import dev.llan.model.board.DisplayType;
import dev.llan.model.board.Tile.TileType;
import dev.llan.model.board.Tile;
public class DisplayHelper {
private enum TileDisplay {
WALL(true, false, false),
VOID(false, true, false),
FLOOR(false, false, true);
private final boolean isWall;
private final boolean isVoid;
private final boolean isFloor;
TileDisplay(boolean isWall, boolean isVoid, boolean isFloor) {
this.isWall = isWall;
this.isVoid = isVoid;
this.isFloor = isFloor;
}
}
public static DisplayType getDisplayType(int row, int col, Tile[][] map) {
Tile tile = map[row][col];
if (tile.getType() == TileType.VACANT) {
return DisplayType.FLOOR;
}
TileDisplay up = getTileDisplay(map[row - 1][col]);
TileDisplay down = getTileDisplay(map[row + 1][col]);
TileDisplay left = getTileDisplay(map[row][col - 1]);
TileDisplay right = getTileDisplay(map[row][col + 1]);
if(left.isWall && right.isWall) {
if(down.isFloor && up.isVoid) {
return DisplayType.WALL_TOP;
} else if (down.isVoid && up.isFloor) {
return DisplayType.WALL_BOTTOM;
}
}
if(up.isWall && down.isWall) {
if(left.isFloor && right.isVoid) {
return DisplayType.WALL_RIGHT;
} else if (left.isVoid && right.isFloor) {
return DisplayType.WALL_LEFT;
}
}
TileDisplay upLeft = getTileDisplay(map[row - 1][col - 1]);
TileDisplay downRight = getTileDisplay(map[row + 1][col + 1]);
if (down.isWall && right.isWall) {
if(downRight.isFloor && upLeft.isVoid) {
return DisplayType.WALL_LEFT;
} else if (downRight.isVoid && upLeft.isFloor) {
return DisplayType.CONNECT_BOTTOM_LEFT;
}
}
if(up.isWall && left.isWall) {
if(upLeft.isFloor && downRight.isVoid) {
return DisplayType.WALL_BOTTOM_RIGHT;
} else if (upLeft.isVoid && downRight.isFloor) {
return DisplayType.WALL_TOP;
}
}
TileDisplay downLeft = getTileDisplay(map[row + 1][col - 1]);
TileDisplay upRight = getTileDisplay(map[row - 1][col + 1]);
if(left.isWall && down.isWall) {
if (downLeft.isFloor && upRight.isVoid) {
return DisplayType.WALL_RIGHT;
} else if (downLeft.isVoid && upRight.isFloor) {
return DisplayType.CONNECT_BOTTOM_RIGHT;
}
}
if(right.isWall && up.isWall) {
if(upRight.isFloor && downLeft.isVoid) {
return DisplayType.WALL_BOTTOM_LEFT;
} else if (upRight.isVoid && downLeft.isFloor) {
return DisplayType.WALL_TOP;
}
}
return DisplayType.NONE;
}
private static TileDisplay getTileDisplay(Tile tile) {
if(tile == null) {
return TileDisplay.VOID;
}
if(tile.getType() == TileType.VACANT) {
return TileDisplay.FLOOR;
}
return TileDisplay.WALL;
}
}