From 40a733e147c4265db6265d503655447e525f6a99 Mon Sep 17 00:00:00 2001 From: Raffson Date: Sat, 17 Feb 2024 18:10:31 +0100 Subject: [PATCH] Fix win/loss not triggering when carriers are present --- game/game.py | 4 ++-- game/theater/conflicttheater.py | 19 +++++++++++++------ qt_ui/widgets/QTopPanel.py | 2 ++ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/game/game.py b/game/game.py index ebe47cfb..761403b9 100644 --- a/game/game.py +++ b/game/game.py @@ -362,10 +362,10 @@ class Game: persistency.autosave(self) def check_win_loss(self) -> TurnState: - if not self.theater.player_points(): + if not self.theater.player_points(state_check=True): return TurnState.LOSS - if not self.theater.enemy_points(): + if not self.theater.enemy_points(state_check=True): return TurnState.WIN return TurnState.CONTINUE diff --git a/game/theater/conflicttheater.py b/game/theater/conflicttheater.py index 7575daed..1c67d1e0 100644 --- a/game/theater/conflicttheater.py +++ b/game/theater/conflicttheater.py @@ -120,20 +120,27 @@ class ConflictTheater: ) return new_point - def control_points_for(self, player: bool) -> Iterator[ControlPoint]: + def control_points_for( + self, player: bool, state_check: bool = False + ) -> Iterator[ControlPoint]: for point in self.controlpoints: if point.captured == player: - yield point + if not state_check: + yield point + elif point.is_carrier and point.runway_is_operational(): + yield point + elif not point.is_carrier: + yield point - def player_points(self) -> List[ControlPoint]: - return list(self.control_points_for(player=True)) + def player_points(self, state_check: bool = False) -> List[ControlPoint]: + return list(self.control_points_for(player=True, state_check=state_check)) def conflicts(self) -> Iterator[FrontLine]: for cp in self.player_points(): yield from cp.front_lines.values() - def enemy_points(self) -> List[ControlPoint]: - return list(self.control_points_for(player=False)) + def enemy_points(self, state_check: bool = False) -> List[ControlPoint]: + return list(self.control_points_for(player=False, state_check=state_check)) def closest_control_point( self, point: Point, allow_naval: bool = False diff --git a/qt_ui/widgets/QTopPanel.py b/qt_ui/widgets/QTopPanel.py index bb97a192..5304121b 100644 --- a/qt_ui/widgets/QTopPanel.py +++ b/qt_ui/widgets/QTopPanel.py @@ -166,6 +166,8 @@ class QTopPanel(QFrame): with logged_duration("Skipping turn"): self.game.pass_turn(no_action=True) GameUpdateSignal.get_instance().updateGame(self.game) + state = self.game_model.game.check_win_loss() + GameUpdateSignal.get_instance().gameStateChanged(state) self.proceedButton.setEnabled(True) def negative_start_packages(self, now: datetime) -> List[Package]: