public void createEnd(int x, int y) { if (elementList.getTypeAt(x, y) != DungeonElementType.ROOM) throw new IllegalStateException("Cannot create end, invalid dungeon element!"); Set<DungeonElement> connected = elementList.getGrouped(elementList.getAt(x, y)); if (connected.size() != 4) throw new IllegalStateException("Cannot create end, invalid dungeon element size!"); List<DungeonElement> endElements = new ArrayList<>(); for (DungeonElement element : connected) { elementList.remove(element); DungeonElement newElement = new DungeonElement(element.x, element.y, DungeonElementType.END); elementArray[element.x][element.y] = DungeonElementType.END; endElements.add(newElement); elementList.add(newElement); for (DungeonDir dir : DungeonDir.values) { if (element.checkConnection(dir)) newElement.connect(dir); } } for (DungeonElement endElement : endElements) { for (DungeonDir dir : DungeonDir.values) { if (elementList.getTypeAt(endElement.x + dir.addX * 2, endElement.y + dir.addY * 2) == DungeonElementType.END) { endElement.connect(dir); } } } }