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);
        }
      }
    }
  }