From fcc0cb9d0c5f52dbf8d47eeca3c3881961b7584b Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Sat, 9 Jan 2021 20:57:33 +0100 Subject: [PATCH] Fix multiplayer conceding --- .../java/forge/game/phase/PhaseHandler.java | 4 ++ .../java/forge/match/AbstractGuiGame.java | 47 +++++++++++++++---- .../forge/player/PlayerControllerHuman.java | 8 +++- 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 8874f974322..f52109c9c84 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -127,6 +127,10 @@ public class PhaseHandler implements java.io.Serializable { game.updatePlayerTurnForView(); setPriority(playerTurn); } + + public final void endPlayerLostTurn() { + setPlayerTurn(handleNextTurn()); + } public final Player getPriorityPlayer() { return pPlayerPriority; diff --git a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java index dd6490bebb3..15f140a0d1d 100644 --- a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java +++ b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java @@ -32,6 +32,7 @@ import forge.interfaces.IGameController; import forge.interfaces.IGuiGame; import forge.interfaces.IMayViewCards; import forge.model.FModel; +import forge.player.PlayerControllerHuman; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; import forge.trackable.TrackableTypes; @@ -43,7 +44,8 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { private final Map gameControllers = Maps.newHashMap(); private final Map originalGameControllers = Maps.newHashMap(); private boolean gamePause = false; - + private boolean ignoreConcedeChain = false; + public final boolean hasLocalPlayers() { return !gameControllers.isEmpty(); } @@ -294,23 +296,48 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { return true; } if (hasLocalPlayers()) { - if (showConfirmDialog(Localizer.getInstance().getMessage("lblConcedeCurrentGame"), Localizer.getInstance().getMessage("lblConcedeTitle"), Localizer.getInstance().getMessage("lblConcede"), Localizer.getInstance().getMessage("lblCancel"))) { - for (final IGameController c : getOriginalGameControllers()) { - // Concede each player on this Gui (except mind-controlled players) - c.concede(); + boolean concedeNeeded = false; + // check if anyone still needs to confirm + for (final IGameController c : getOriginalGameControllers()) { + if (c instanceof PlayerControllerHuman) { + if (((PlayerControllerHuman) c).getPlayer().getOutcome() == null) { + concedeNeeded = true; + } } - } else { - return false; + } + if (concedeNeeded) { + if (showConfirmDialog(Localizer.getInstance().getMessage("lblConcedeCurrentGame"), Localizer.getInstance().getMessage("lblConcedeTitle"), Localizer.getInstance().getMessage("lblConcede"), Localizer.getInstance().getMessage("lblCancel"))) { + for (final IGameController c : getOriginalGameControllers()) { + // Concede each player on this Gui (except mind-controlled players) + c.concede(); + } + } + else { + return false; + } + } + else { + if (ignoreConcedeChain) { + return false; + } + else { + return true; + } + } if (gameView.isGameOver()) { // Don't immediately close, wait for win/lose screen return false; - } else { - for (PlayerView player : getLocalPlayers()){ - if (!player.isAI()){ + } + else { + // since the nextGameDecision might come from somewhere else it will try and concede too + ignoreConcedeChain = true; + for (PlayerView player : getLocalPlayers()) { + if (!player.isAI()) { getGameController(player).nextGameDecision(NextGameDecision.QUIT); } } + ignoreConcedeChain = false; return false; } } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index b7243562e3a..ddc3135f455 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -2943,7 +2943,13 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } public void autoPassUntilEndOfTurn() { - getGui().autoPassUntilEndOfTurn(getLocalPlayerView()); + // if we already conceded just skip everything + if (player.getOutcome() != null) { + player.getGame().getPhaseHandler().endPlayerLostTurn(); + } + else { + getGui().autoPassUntilEndOfTurn(getLocalPlayerView()); + } } @Override