public TeleportLocation findTeleportLocation(DescentMap map) {
    ArrayList<Room> possible_rooms = new ArrayList<Room>();
    for (Room room : map.getAllRooms()) {
      if (room.getHeight() > bound_object_diameter && room.getWidth() > bound_object_diameter) {
        possible_rooms.add(room);
      }
    }
    Room dest_room;
    Point2D.Double location;
    do {
      dest_room = possible_rooms.remove((int) (Math.random() * possible_rooms.size()));
      location =
              MapUtils.randomInternalPoint(dest_room.getNWCorner(), dest_room.getSECorner(),
                      bound_object_radius);
      for (Pyro pyro : dest_room.getPyros()) {
        if (MapUtils.distance2(pyro, location.x, location.y) < min_pyro_teleport_distance2) {
          dest_room = null;
          break;
        }
      }
    } while (dest_room == null && !possible_rooms.isEmpty());
    return (dest_room != null ? new TeleportLocation(dest_room, location.x, location.y) : null);
  }