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

@@ -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<PlayerView, IGameController> gameControllers = Maps.newHashMap();
private final Map<PlayerView, IGameController> 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;
}
}

View File

@@ -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