Recover combat instances from flight state when initializing aircraft simulation (#3511)

This PR recovers combat instances from the flight state when
initializing aircraft simulation. Flight states are serialized into a
game save but the state of the aircraft simulation is not. When
deserializing a game, the aircraft simulation would otherwise lose track
of the combat instances, leading the simulation never exiting combat in
some scenarios e.g. when at the mission IP.
This commit is contained in:
zhexu14 2025-06-22 19:32:58 +10:00 committed by GitHub
parent 9baebeebf8
commit 7b1c84d347
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -7,9 +7,7 @@ from datetime import datetime, timedelta
from typing_extensions import TYPE_CHECKING
from game.ato.flightstate import (
Uninitialized,
)
from game.ato.flightstate import Uninitialized, Completed, InCombat
from game.settings.settings import FastForwardStopCondition, CombatResolutionMethod
from .combat import CombatInitiator, FrozenCombat
from .gameupdateevents import GameUpdateEvents
@ -71,10 +69,20 @@ class AircraftSimulation:
events.complete_simulation()
def set_initial_flight_states(self) -> None:
# Initialize flights in Uninitialized state
now = self.game.simulation_time
for flight in self.iter_flights():
flight.state.initialize(now)
# Recover combat instances from flight states. Flight state information is serialized
# when saving a game but the aircraft simulation state is not. Combat instances are
# de-duplicated as multiple flights can be involved in a single combat instance.
combats = set()
for flight in self.iter_flights():
if type(flight.state) == InCombat:
combats.add(flight.state.combat)
self.combats = list(combats)
def iter_flights(self) -> Iterator[Flight]:
packages = itertools.chain(
self.game.blue.ato.packages, self.game.red.ato.packages