From 7e415b3fd7cc9944b64bee4c8d33211e699e3d92 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Sun, 31 Jan 2021 13:21:34 -0800 Subject: [PATCH] Fix carrier packages at beginning of campaign. Fixes https://github.com/Khopa/dcs_liberation/issues/819 --- gen/flights/closestairfields.py | 10 ++++++++-- gen/flights/flightplan.py | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/gen/flights/closestairfields.py b/gen/flights/closestairfields.py index f3e5382b..7dfab22f 100644 --- a/gen/flights/closestairfields.py +++ b/gen/flights/closestairfields.py @@ -15,11 +15,17 @@ class ClosestAirfields: def __init__(self, target: MissionTarget, all_control_points: List[ControlPoint]) -> None: self.target = target - airfields = (c for c in all_control_points if c.runway_is_operational()) + # This cache is configured once on load, so it's important that it is + # complete and deterministic to avoid different behaviors across loads. + # E.g. https://github.com/Khopa/dcs_liberation/issues/819 self.closest_airfields: List[ControlPoint] = sorted( - airfields, key=lambda c: self.target.distance_to(c) + all_control_points, key=lambda c: self.target.distance_to(c) ) + @property + def operational_airfields(self) -> Iterator[ControlPoint]: + return (c for c in self.closest_airfields if c.runway_is_operational()) + def airfields_within(self, distance: Distance) -> Iterator[ControlPoint]: """Iterates over all airfields within the given range of the target. diff --git a/gen/flights/flightplan.py b/gen/flights/flightplan.py index 28dd4cbd..bbf45b1f 100644 --- a/gen/flights/flightplan.py +++ b/gen/flights/flightplan.py @@ -1041,7 +1041,7 @@ class FlightPlanBuilder: def racetrack_for_objective(self, location: MissionTarget, barcap: bool) -> Tuple[Point, Point]: closest_cache = ObjectiveDistanceCache.get_closest_airfields(location) - for airfield in closest_cache.closest_airfields: + for airfield in closest_cache.operational_airfields: # If the mission is a BARCAP of an enemy airfield, find the *next* # closest enemy airfield. if airfield == self.package.target: @@ -1517,7 +1517,7 @@ class FlightPlanBuilder: cache = ObjectiveDistanceCache.get_closest_airfields( self.package.target ) - for airfield in cache.closest_airfields: + for airfield in cache.operational_airfields: for flight in self.package.flights: if flight.departure == airfield: return airfield