protected OrderedSet<Coord> viableDoorways(boolean doubleDoors, char[][] map) { OrderedSet<Coord> doors = new OrderedSet<>(); OrderedSet<Coord> blocked = new OrderedSet<>(4); DijkstraMap dm = new DijkstraMap(map, DijkstraMap.Measurement.EUCLIDEAN); for (int x = 1; x < map.length - 1; x++) { for (int y = 1; y < map[x].length - 1; y++) { if (map[x][y] == '#') continue; if (doubleDoors) { if (x >= map.length - 2 || y >= map[x].length - 2) continue; else { if (map[x + 1][y] != '#' && map[x + 2][y] == '#' && map[x - 1][y] == '#' && map[x][y + 1] != '#' && map[x][y - 1] != '#' && map[x + 1][y + 1] != '#' && map[x + 1][y - 1] != '#') { if (map[x + 2][y + 1] != '#' || map[x - 1][y + 1] != '#' || map[x + 2][y - 1] != '#' || map[x - 1][y - 1] != '#') { dm.resetMap(); dm.clearGoals(); dm.setGoal(x, y + 1); blocked.clear(); blocked.add(Coord.get(x, y)); blocked.add(Coord.get(x + 1, y)); if (dm.partialScan(16, blocked)[x][y - 1] < DijkstraMap.FLOOR) continue; doors.add(Coord.get(x, y)); doors.add(Coord.get(x + 1, y)); doors = removeAdjacent(doors, Coord.get(x, y), Coord.get(x + 1, y)); continue; } } else if (map[x][y + 1] != '#' && map[x][y + 2] == '#' && map[x][y - 1] == '#' && map[x + 1][y] != '#' && map[x - 1][y] != '#' && map[x + 1][y + 1] != '#' && map[x - 1][y + 1] != '#') { if (map[x + 1][y + 2] != '#' || map[x + 1][y - 1] != '#' || map[x - 1][y + 2] != '#' || map[x - 1][y - 1] != '#') { dm.resetMap(); dm.clearGoals(); dm.setGoal(x + 1, y); blocked.clear(); blocked.add(Coord.get(x, y)); blocked.add(Coord.get(x, y + 1)); if (dm.partialScan(16, blocked)[x - 1][y] < DijkstraMap.FLOOR) continue; doors.add(Coord.get(x, y)); doors.add(Coord.get(x, y + 1)); doors = removeAdjacent(doors, Coord.get(x, y), Coord.get(x, y + 1)); continue; } } } } if (map[x + 1][y] == '#' && map[x - 1][y] == '#' && map[x][y + 1] != '#' && map[x][y - 1] != '#') { if (map[x + 1][y + 1] != '#' || map[x - 1][y + 1] != '#' || map[x + 1][y - 1] != '#' || map[x - 1][y - 1] != '#') { dm.resetMap(); dm.clearGoals(); dm.setGoal(x, y + 1); blocked.clear(); blocked.add(Coord.get(x, y)); if (dm.partialScan(16, blocked)[x][y - 1] < DijkstraMap.FLOOR) continue; doors.add(Coord.get(x, y)); doors = removeAdjacent(doors, Coord.get(x, y)); } } else if (map[x][y + 1] == '#' && map[x][y - 1] == '#' && map[x + 1][y] != '#' && map[x - 1][y] != '#') { if (map[x + 1][y + 1] != '#' || map[x + 1][y - 1] != '#' || map[x - 1][y + 1] != '#' || map[x - 1][y - 1] != '#') { dm.resetMap(); dm.clearGoals(); dm.setGoal(x + 1, y); blocked.clear(); blocked.add(Coord.get(x, y)); if (dm.partialScan(16, blocked)[x - 1][y] < DijkstraMap.FLOOR) continue; doors.add(Coord.get(x, y)); doors = removeAdjacent(doors, Coord.get(x, y)); } } } } return doors; }