@Override
  public MapObject doNextAction(MapEngine engine, double s_elapsed) {
    MultipleObject created_objects = new MultipleObject();
    created_objects.addObject(super.doNextAction(engine, s_elapsed));

    frame_time_left -= s_elapsed;
    if (frame_time_left < 0.0) {
      ++frame_num;
      frame_time_left = SECONDS_PER_FRAME;
    }

    if (!is_fully_armed) {
      time_until_fully_armed -= s_elapsed;
      if (time_until_fully_armed < 0.0) {
        is_fully_armed = true;
      }
    }

    if (move_speed > 0.0) {
      move_speed = Math.max(move_speed - MOVE_SPEED_DECELERATION * s_elapsed, 0.0);
    }

    boolean is_outside_source =
            Math.abs(source.getX() - x_loc) > source_combined_radius ||
                    Math.abs(source.getY() - y_loc) > source_combined_radius;
    created_objects.addObject(handleAnyCollisions(engine, room, is_outside_source));
    if (!is_in_map) {
      return created_objects;
    }

    RoomSide close_neighbor_side = MapUtils.findRoomBorderSide(this, Unit.LARGEST_UNIT_RADIUS);
    if (close_neighbor_side != null) {
      Room neighbor = room.getNeighborInDirection(close_neighbor_side);
      if (neighbor != null) {
        created_objects.addObject(handleAnyCollisions(engine, neighbor, is_outside_source));
      }
    }

    return created_objects;
  }