From ba10298dbcfee6c44a876f035a4894c1ea9e1732 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Mon, 6 Feb 2023 00:14:08 -0800 Subject: [PATCH] Allow adjusting TOTs after sim start. This makes the start time in WaitingForStart dynamic, which is more expensive but probably still cheap enough. It also checks that the new TOT will not result in a start time in the past when the player changes the TOT. https://github.com/dcs-liberation/dcs_liberation/issues/1680 --- game/ato/flightstate/flightstate.py | 7 ++----- game/ato/flightstate/waitingforstart.py | 12 +++++------- qt_ui/models.py | 10 +++++++++- qt_ui/windows/mission/QPackageDialog.py | 3 ++- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/game/ato/flightstate/flightstate.py b/game/ato/flightstate/flightstate.py index da2ff15a..46bf2f34 100644 --- a/game/ato/flightstate/flightstate.py +++ b/game/ato/flightstate/flightstate.py @@ -24,13 +24,10 @@ class FlightState(ABC): def reinitialize(self, now: datetime) -> None: from game.ato.flightstate import WaitingForStart - start_time = self.flight.flight_plan.startup_time() - if start_time <= now: + if self.flight.flight_plan.startup_time() <= now: self._set_active_flight_state(now) else: - self.flight.set_state( - WaitingForStart(self.flight, self.settings, start_time) - ) + self.flight.set_state(WaitingForStart(self.flight, self.settings)) def _set_active_flight_state(self, now: datetime) -> None: from game.ato.flightstate import StartUp diff --git a/game/ato/flightstate/waitingforstart.py b/game/ato/flightstate/waitingforstart.py index da218715..9e65235d 100644 --- a/game/ato/flightstate/waitingforstart.py +++ b/game/ato/flightstate/waitingforstart.py @@ -18,19 +18,17 @@ if TYPE_CHECKING: class WaitingForStart(AtDeparture): - def __init__( - self, - flight: Flight, - settings: Settings, - start_time: datetime, - ) -> None: + def __init__(self, flight: Flight, settings: Settings) -> None: super().__init__(flight, settings) - self.start_time = start_time @property def start_type(self) -> StartType: return self.flight.start_type + @property + def start_time(self) -> datetime: + return self.flight.flight_plan.startup_time() + def on_game_tick( self, events: GameUpdateEvents, time: datetime, duration: timedelta ) -> None: diff --git a/qt_ui/models.py b/qt_ui/models.py index fd5ce200..127a8447 100644 --- a/qt_ui/models.py +++ b/qt_ui/models.py @@ -185,10 +185,18 @@ class PackageModel(QAbstractListModel): """Returns the flight located at the given index.""" return self.package.flights[index.row()] - def set_tot(self, tot: datetime.datetime) -> None: + def set_tot(self, tot: datetime.datetime) -> datetime: with self.game_model.sim_controller.paused_sim(): + previous_tot = self.package.time_over_target self.package.time_over_target = tot + for flight in self.package.flights: + if ( + flight.flight_plan.startup_time() + < self.game_model.sim_controller.current_time_in_sim + ): + self.package.time_over_target = previous_tot self.update_tot() + return self.package.time_over_target def set_asap(self, asap: bool) -> None: with self.game_model.sim_controller.paused_sim(): diff --git a/qt_ui/windows/mission/QPackageDialog.py b/qt_ui/windows/mission/QPackageDialog.py index 633fd42d..3e785412 100644 --- a/qt_ui/windows/mission/QPackageDialog.py +++ b/qt_ui/windows/mission/QPackageDialog.py @@ -149,11 +149,12 @@ class QPackageDialog(QDialog): def save_tot(self) -> None: # TODO: This is going to break horribly around midnight. time = self.tot_spinner.time() - self.package_model.set_tot( + tot = self.package_model.set_tot( self.package_model.package.time_over_target.replace( hour=time.hour(), minute=time.minute(), second=time.second() ) ) + self.tot_spinner.setTime(self.tot_qtime()) def set_asap(self, checked: bool) -> None: self.package_model.set_asap(checked)