From b6895e302ebf20ba88ab9efc6cf2de40640e2bf5 Mon Sep 17 00:00:00 2001 From: Magnus Wolffelt Date: Sun, 1 Aug 2021 20:33:21 +0200 Subject: [PATCH] Estimate preferred patrol altitude based on max speed (cherry picked from commit a3e3e9046f4c629114e8f46e5ef6b6718c6852c2) --- game/dcs/aircrafttype.py | 28 ++++++++++++++++++++++++++++ gen/flights/flightplan.py | 21 +++++++++++---------- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/game/dcs/aircrafttype.py b/game/dcs/aircrafttype.py index 4b588813..90c42090 100644 --- a/game/dcs/aircrafttype.py +++ b/game/dcs/aircrafttype.py @@ -144,6 +144,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 248846d6..2b81f911 100644 --- a/gen/flights/flightplan.py +++ b/gen/flights/flightplan.py @@ -1168,11 +1168,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.game, self.is_player) @@ -1406,11 +1407,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