diff --git a/game/dcs/aircrafttype.py b/game/dcs/aircrafttype.py index e3a9a213..d1edc50f 100644 --- a/game/dcs/aircrafttype.py +++ b/game/dcs/aircrafttype.py @@ -180,6 +180,34 @@ class AircraftType(UnitType[Type[FlyingType]]): def max_speed(self) -> Speed: return kph(self.dcs_unit_type.max_speed) + @property + def preferred_patrol_altitude(self) -> Distance: + if self.patrol_altitude: + return self.patrol_altitude + else: + # Estimate based on max speed + # Aircaft with max speed 200 kph will prefer patrol at 5000 ft + # Aircraft with max speed 2700 kph will prefer pratrol at 33 000 ft + altitude_for_lowest_speed = feet(5 * 100) + altitude_for_highest_speed = feet(33 * 1000) + lowest_speed = kph(200) + highest_speed = kph(2700) + factor = (self.max_speed - lowest_speed).kph / ( + highest_speed - lowest_speed + ).kph + altitude = ( + altitude_for_lowest_speed + + (altitude_for_highest_speed - altitude_for_lowest_speed) * factor + ) + logging.debug( + f"Preferred patrol altitude for {self.dcs_unit_type.id}: {altitude.feet}" + ) + rounded_altitude = feet(round(1000 * round(altitude.feet / 1000))) + return max( + altitude_for_lowest_speed, + min(altitude_for_highest_speed, rounded_altitude), + ) + def alloc_flight_radio(self, radio_registry: RadioRegistry) -> RadioFrequency: from gen.radios import ChannelInUseError, kHz diff --git a/gen/flights/flightplan.py b/gen/flights/flightplan.py index d3559442..463be24d 100644 --- a/gen/flights/flightplan.py +++ b/gen/flights/flightplan.py @@ -1116,11 +1116,12 @@ class FlightPlanBuilder: raise InvalidObjectiveLocation(flight.flight_type, location) start_pos, end_pos = self.racetrack_for_objective(location, barcap=True) - patrol_alt = meters( - random.randint( - int(self.doctrine.min_patrol_altitude.meters), - int(self.doctrine.max_patrol_altitude.meters), - ) + + preferred_alt = flight.unit_type.preferred_patrol_altitude + randomized_alt = preferred_alt + feet(random.randint(-2, 1) * 1000) + patrol_alt = max( + self.doctrine.min_patrol_altitude, + min(self.doctrine.max_patrol_altitude, randomized_alt), ) builder = WaypointBuilder(flight, self.coalition) @@ -1355,11 +1356,11 @@ class FlightPlanBuilder: """ location = self.package.target - patrol_alt = meters( - random.randint( - int(self.doctrine.min_patrol_altitude.meters), - int(self.doctrine.max_patrol_altitude.meters), - ) + preferred_alt = flight.unit_type.preferred_patrol_altitude + randomized_alt = preferred_alt + feet(random.randint(-2, 1) * 1000) + patrol_alt = max( + self.doctrine.min_patrol_altitude, + min(self.doctrine.max_patrol_altitude, randomized_alt), ) # Create points