Merge branch 'fixConcedeFreeze' into 'master'

Fix desktop multiplayer conceding

Closes #1685

See merge request core-developers/forge!3576
This commit is contained in:
Sol
2021-01-17 01:59:06 +00:00
2 changed files with 33 additions and 10 deletions

View File

@@ -31,6 +31,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;
@@ -42,6 +43,7 @@ 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();
@@ -293,23 +295,42 @@ 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 {
return !ignoreConcedeChain;
}
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;
}
}