Fix multiplayer conceding

This commit is contained in:
tool4EvEr
2021-01-09 20:57:33 +01:00
parent 9567777826
commit fcc0cb9d0c
3 changed files with 48 additions and 11 deletions

View File

@@ -127,6 +127,10 @@ public class PhaseHandler implements java.io.Serializable {
game.updatePlayerTurnForView(); game.updatePlayerTurnForView();
setPriority(playerTurn); setPriority(playerTurn);
} }
public final void endPlayerLostTurn() {
setPlayerTurn(handleNextTurn());
}
public final Player getPriorityPlayer() { public final Player getPriorityPlayer() {
return pPlayerPriority; return pPlayerPriority;

View File

@@ -32,6 +32,7 @@ import forge.interfaces.IGameController;
import forge.interfaces.IGuiGame; import forge.interfaces.IGuiGame;
import forge.interfaces.IMayViewCards; import forge.interfaces.IMayViewCards;
import forge.model.FModel; import forge.model.FModel;
import forge.player.PlayerControllerHuman;
import forge.properties.ForgeConstants; import forge.properties.ForgeConstants;
import forge.properties.ForgePreferences; import forge.properties.ForgePreferences;
import forge.trackable.TrackableTypes; import forge.trackable.TrackableTypes;
@@ -43,7 +44,8 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards {
private final Map<PlayerView, IGameController> gameControllers = Maps.newHashMap(); private final Map<PlayerView, IGameController> gameControllers = Maps.newHashMap();
private final Map<PlayerView, IGameController> originalGameControllers = Maps.newHashMap(); private final Map<PlayerView, IGameController> originalGameControllers = Maps.newHashMap();
private boolean gamePause = false; private boolean gamePause = false;
private boolean ignoreConcedeChain = false;
public final boolean hasLocalPlayers() { public final boolean hasLocalPlayers() {
return !gameControllers.isEmpty(); return !gameControllers.isEmpty();
} }
@@ -294,23 +296,48 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards {
return true; return true;
} }
if (hasLocalPlayers()) { if (hasLocalPlayers()) {
if (showConfirmDialog(Localizer.getInstance().getMessage("lblConcedeCurrentGame"), Localizer.getInstance().getMessage("lblConcedeTitle"), Localizer.getInstance().getMessage("lblConcede"), Localizer.getInstance().getMessage("lblCancel"))) { boolean concedeNeeded = false;
for (final IGameController c : getOriginalGameControllers()) { // check if anyone still needs to confirm
// Concede each player on this Gui (except mind-controlled players) for (final IGameController c : getOriginalGameControllers()) {
c.concede(); 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()) { if (gameView.isGameOver()) {
// Don't immediately close, wait for win/lose screen // Don't immediately close, wait for win/lose screen
return false; return false;
} else { }
for (PlayerView player : getLocalPlayers()){ else {
if (!player.isAI()){ // 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); getGameController(player).nextGameDecision(NextGameDecision.QUIT);
} }
} }
ignoreConcedeChain = false;
return false; return false;
} }
} }

View File

@@ -2943,7 +2943,13 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
} }
public void autoPassUntilEndOfTurn() { 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 @Override