From c10c90e075cb705df43e3dceb4d152a63aae469b Mon Sep 17 00:00:00 2001 From: drdev Date: Tue, 23 Sep 2014 19:24:14 +0000 Subject: [PATCH] Fix crash when starting next game of match --- .../src/main/java/forge/GuiDesktop.java | 4 +-- .../src/main/java/forge/control/FControl.java | 23 ++++++++--------- .../forge/screens/match/ControlWinLose.java | 8 +++--- .../screens/match/QuestDraftWinLose.java | 2 +- .../java/forge/match/input/InputBase.java | 25 +++++++++++++++---- .../forge/player/PlayerControllerHuman.java | 2 +- 6 files changed, 38 insertions(+), 26 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java index eb8bf63bc9e..34ced7c8fe4 100644 --- a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java +++ b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java @@ -488,7 +488,7 @@ public class GuiDesktop implements IGuiBase { @Override public void endCurrentGame() { - FControl.instance.endCurrentGame(); + FControl.instance.endCurrentGame(false, false); } @Override @@ -562,7 +562,7 @@ public class GuiDesktop implements IGuiBase { @Override public void continueMatch(Match match) { - Singletons.getControl().endCurrentGame(); + Singletons.getControl().endCurrentGame(false, false); if (match == null) { Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN); } diff --git a/forge-gui-desktop/src/main/java/forge/control/FControl.java b/forge-gui-desktop/src/main/java/forge/control/FControl.java index c15ccaa02f6..12be410060f 100644 --- a/forge-gui-desktop/src/main/java/forge/control/FControl.java +++ b/forge-gui-desktop/src/main/java/forge/control/FControl.java @@ -450,16 +450,6 @@ public enum FControl implements KeyEventDispatcher { return null; } - public final void startGameInSameMatch() { - startGameWithUi(game.getMatch()); - } - public final void startGameAndClearMatch() { - if (game != null) { - game.getMatch().clearGamesPlayed(); - } - startGameInSameMatch(); - } - public final void startGameWithUi(final Match match) { if (game != null) { setCurrentScreen(FScreen.MATCH_SCREEN); @@ -561,12 +551,21 @@ public enum FControl implements KeyEventDispatcher { SOverlayUtils.hideOverlay(); } - public final void endCurrentGame() { + public final void endCurrentGame(boolean nextGame, boolean restart) { if (game == null) { return; } + Match match = game.getMatch(); + game = null; + Singletons.getView().getNavigationBar().closeTab(FScreen.MATCH_SCREEN); - game = null; + if (nextGame) { + startGameWithUi(match); + } + else if (restart) { + match.clearGamesPlayed(); + startGameWithUi(match); + } } private FControlGamePlayback playbackControl; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java index 5695a7b80b9..31bce2b7bb8 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java @@ -58,23 +58,21 @@ public class ControlWinLose { SOverlayUtils.hideOverlay(); saveOptions(); - Singletons.getControl().endCurrentGame(); - Singletons.getControl().startGameInSameMatch(); + Singletons.getControl().endCurrentGame(true, false); } /** Action performed when "restart" button is pressed in default win/lose UI. */ public void actionOnRestart() { SOverlayUtils.hideOverlay(); saveOptions(); - Singletons.getControl().endCurrentGame(); - Singletons.getControl().startGameAndClearMatch(); + Singletons.getControl().endCurrentGame(false, true); } /** Action performed when "quit" button is pressed in default win/lose UI. */ public void actionOnQuit() { // Reset other stuff saveOptions(); - Singletons.getControl().endCurrentGame(); + Singletons.getControl().endCurrentGame(false, false); Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN); SOverlayUtils.hideOverlay(); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java index 1a96bd877ca..3eea046d44d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java @@ -165,7 +165,7 @@ public class QuestDraftWinLose extends ControlWinLose { FModel.getQuestPreferences().save(); Singletons.getControl().writeMatchPreferences(); - Singletons.getControl().endCurrentGame(); + Singletons.getControl().endCurrentGame(false, false); Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN); SOverlayUtils.hideOverlay(); diff --git a/forge-gui/src/main/java/forge/match/input/InputBase.java b/forge-gui/src/main/java/forge/match/input/InputBase.java index 70dae7bdd59..0ec25ad6beb 100644 --- a/forge-gui/src/main/java/forge/match/input/InputBase.java +++ b/forge-gui/src/main/java/forge/match/input/InputBase.java @@ -67,7 +67,7 @@ public abstract class InputBase implements java.io.Serializable, Input { finished = true; if (allowAwaitNextInput()) { - awaitNextInput(this); + awaitNextInput(getGameView()); } } @@ -78,18 +78,17 @@ public abstract class InputBase implements java.io.Serializable, Input { private static final Timer awaitNextInputTimer = new Timer(); private static TimerTask awaitNextInputTask; - public static void awaitNextInput(final Input input) { + public static void awaitNextInput(final LocalGameView gameView) { //delay updating prompt to await next input briefly so buttons don't flicker disabled then enabled awaitNextInputTask = new TimerTask() { @Override public void run() { - FThreads.invokeInEdtLater(input.getGui(), new Runnable() { + FThreads.invokeInEdtLater(gameView.getGui(), new Runnable() { @Override public void run() { synchronized (awaitNextInputTimer) { if (awaitNextInputTask != null) { - input.getGui().showPromptMessage(input.getOwner(), "Waiting for opponent..."); - ButtonUtil.update(input, false, false, false); + updatePromptForAwait(gameView); awaitNextInputTask = null; } } @@ -100,6 +99,22 @@ public abstract class InputBase implements java.io.Serializable, Input { awaitNextInputTimer.schedule(awaitNextInputTask, 250); } + public static void waitForHumanOpponent(final LocalGameView gameView) { + cancelAwaitNextInput(); + FThreads.invokeInEdtNowOrLater(gameView.getGui(), new Runnable() { + @Override + public void run() { + updatePromptForAwait(gameView); + } + }); + } + + private static void updatePromptForAwait(final LocalGameView gameView) { + InputNone inputNone = new InputNone(gameView); + inputNone.getGui().showPromptMessage(inputNone.getOwner(), "Waiting for opponent..."); + ButtonUtil.update(inputNone, false, false, false); + } + public static void cancelAwaitNextInput() { synchronized (awaitNextInputTimer) { //ensure task doesn't reset awaitNextInputTask during this block if (awaitNextInputTask != null) { diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index c14f1de95b9..127d4e58ebf 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -819,7 +819,7 @@ public class PlayerControllerHuman extends PlayerController { InputNone inputNone = new InputNone(gameView); getGui().showPromptMessage(inputNone.getOwner(), ""); ButtonUtil.update(inputNone, false, false, false); - InputBase.awaitNextInput(inputNone); + InputBase.awaitNextInput(gameView); } @Override