Fix crash when starting next game of match

This commit is contained in:
drdev
2014-09-23 19:24:14 +00:00
parent d4b46dbf8b
commit c10c90e075
6 changed files with 38 additions and 26 deletions

View File

@@ -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);
}

View File

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

View File

@@ -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();
}

View File

@@ -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();

View File

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

View File

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