mourning-ember / src / main / java / dev / llan / model / board / generation / DisplayHelper.java
DisplayHelper.java
Raw
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;
  }
}