Estimate preferred patrol altitude based on max speed

(cherry picked from commit a3e3e9046f)
This commit is contained in:
Magnus Wolffelt
2021-08-01 20:33:21 +02:00
committed by Dan Albert
parent 0aef7a1c80
commit b6895e302e
2 changed files with 39 additions and 10 deletions

View File

@@ -144,6 +144,34 @@ class AircraftType(UnitType[Type[FlyingType]]):
def max_speed(self) -> Speed: def max_speed(self) -> Speed:
return kph(self.dcs_unit_type.max_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: def alloc_flight_radio(self, radio_registry: RadioRegistry) -> RadioFrequency:
from gen.radios import ChannelInUseError, kHz from gen.radios import ChannelInUseError, kHz

View File

@@ -1168,11 +1168,12 @@ class FlightPlanBuilder:
raise InvalidObjectiveLocation(flight.flight_type, location) raise InvalidObjectiveLocation(flight.flight_type, location)
start_pos, end_pos = self.racetrack_for_objective(location, barcap=True) start_pos, end_pos = self.racetrack_for_objective(location, barcap=True)
patrol_alt = meters(
random.randint( preferred_alt = flight.unit_type.preferred_patrol_altitude
int(self.doctrine.min_patrol_altitude.meters), randomized_alt = preferred_alt + feet(random.randint(-2, 1) * 1000)
int(self.doctrine.max_patrol_altitude.meters), patrol_alt = max(
) self.doctrine.min_patrol_altitude,
min(self.doctrine.max_patrol_altitude, randomized_alt),
) )
builder = WaypointBuilder(flight, self.game, self.is_player) builder = WaypointBuilder(flight, self.game, self.is_player)
@@ -1406,11 +1407,11 @@ class FlightPlanBuilder:
""" """
location = self.package.target location = self.package.target
patrol_alt = meters( preferred_alt = flight.unit_type.preferred_patrol_altitude
random.randint( randomized_alt = preferred_alt + feet(random.randint(-2, 1) * 1000)
int(self.doctrine.min_patrol_altitude.meters), patrol_alt = max(
int(self.doctrine.max_patrol_altitude.meters), self.doctrine.min_patrol_altitude,
) min(self.doctrine.max_patrol_altitude, randomized_alt),
) )
# Create points # Create points