public void analyzeShots(RoomAnalysis ra) {
    double closest_shot_distance2 = Double.MAX_VALUE;
    for (Shot shot : current_room.getShots()) {
      double shot_distance2 = MapUtils.distance2(bound_object, shot);
      if (shot.getType().equals(ObjectType.MegaMissile) &&
              MapUtils.distance2(bound_object, shot) < MEGA_MISSILE_MIN_DISTANCE2 &&
              // Is the Pyro facing the MegaMissile?
              Math.abs(MapUtils.angleTo(bound_object, shot)) < MapUtils.PI_OVER_TWO &&
              // Is the MegaMissile facing away from the Pyro?
              Math.abs(MapUtils.angleTo(shot, bound_object)) > MapUtils.PI_OVER_TWO) {
        ra.is_close_behind_mega = true;
      }
      if (shot.getSource().equals(bound_object) || shot_distance2 > closest_shot_distance2) {
        continue;
      }
      StrafeDirection strafe = findReactionToShot(shot);
      if (!strafe.equals(StrafeDirection.NONE)) {
        ra.shot_reaction = strafe;
        closest_shot_distance2 = MapUtils.distance2(bound_object, shot);
      }
    }
  }