diff --git a/src/main/java/forge/FThreads.java b/src/main/java/forge/FThreads.java index deabc24c83a..aed693b9c15 100644 --- a/src/main/java/forge/FThreads.java +++ b/src/main/java/forge/FThreads.java @@ -1,5 +1,6 @@ package forge; +import java.io.PrintStream; import java.lang.reflect.InvocationTargetException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -103,13 +104,24 @@ public class FThreads { getCachedPool().execute(toRun); } + public static void dumpStackTrace(PrintStream stream) { + StackTraceElement[] trace = Thread.currentThread().getStackTrace(); + stream.printf("%s > %s called from %s%n", debugGetCurrThreadId(), trace[2].getClassName()+"."+trace[2].getMethodName(), trace[3].toString()); + int i = 0; + for(StackTraceElement se : trace) { + if(i<2) i++; + else stream.println(se.toString()); + + } + } + public static void invokeInNewThread(final Runnable proc, boolean lockUI) { Runnable toRun = proc; final InputQueue iq = Singletons.getControl().getMatch().getInput(); //final GameState game = Singletons.getControl().getMatch().getCurrentGame(); //final InputQueue iq = game.getMatch().getInput(); if( lockUI ) { - + // StackTraceElement[] trace = Thread.currentThread().getStackTrace(); // System.out.printf("%s > Invoke in new thread during %s called from %s%n", FThreads.isEDT() ? "EDT" : "TRD", game.getPhaseHandler().getPhase(), trace[2].toString()); // if( trace[2].toString().contains("InputBase.stop")) diff --git a/src/main/java/forge/control/input/InputQueue.java b/src/main/java/forge/control/input/InputQueue.java index 4abe9435004..fcb1f67d36e 100644 --- a/src/main/java/forge/control/input/InputQueue.java +++ b/src/main/java/forge/control/input/InputQueue.java @@ -19,6 +19,7 @@ package forge.control.input; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque; + import forge.game.GameAge; import forge.game.GameState; import forge.game.phase.PhaseHandler; @@ -134,7 +135,6 @@ public class InputQueue extends MyObservable implements java.io.Serializable { throw new RuntimeException("No player has priority!"); PlayerController pc = priority.getController(); - // If the Phase we're in doesn't allow for Priority, move to next phase if (!handler.isPlayerPriorityAllowed()) { return pc.getAutoPassPriorityInput(); diff --git a/src/main/java/forge/game/MatchController.java b/src/main/java/forge/game/MatchController.java index ebad6c7d366..973a4f276d1 100644 --- a/src/main/java/forge/game/MatchController.java +++ b/src/main/java/forge/game/MatchController.java @@ -7,8 +7,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import javax.swing.JOptionPane; - import forge.Constant.Preferences; import forge.FThreads; import forge.Singletons; @@ -23,6 +21,7 @@ import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayerHuman; import forge.game.player.Player; import forge.game.player.PlayerStatistics; +import forge.gui.GuiDialog; import forge.gui.framework.EDocID; import forge.gui.framework.SDisplayUtil; import forge.gui.match.CMatchUI; @@ -365,22 +364,25 @@ public class MatchController { private Player determineFirstTurnPlayer(final GameOutcome lastGameOutcome, final GameState game) { // Only cut/coin toss if it's the first game of the match Player goesFirst = null; - Player humanPlayer = Singletons.getControl().getPlayer(); + final String message; + //Player humanPlayer = Singletons.getControl().getPlayer(); boolean isFirstGame = lastGameOutcome == null; if (isFirstGame) { goesFirst = seeWhoPlaysFirstDice(game); + message = goesFirst + " has won the coin toss."; } else { for(Player p : game.getPlayers()) { - if(lastGameOutcome.isWinner(p.getLobbyPlayer())) { - goesFirst = p.getOpponent(); + if(!lastGameOutcome.isWinner(p.getLobbyPlayer())) { + goesFirst = p; break; } } + message = goesFirst + " lost the last game."; } - String message = goesFirst + ( isFirstGame ? " has won the coin toss." : " lost the last game."); + boolean willPlay = goesFirst.getController().getWillPlayOnFirstTurn(message); - if ( goesFirst != humanPlayer ) { - JOptionPane.showMessageDialog(null, message + "\nComputer Going First", "You are drawing", JOptionPane.INFORMATION_MESSAGE); + if ( goesFirst != FControl.SINGLETON_INSTANCE.getPlayer() ) { + GuiDialog.message(message + "\nComputer Going First"); } goesFirst = willPlay ? goesFirst : goesFirst.getOpponent(); game.getPhaseHandler().setPlayerTurn(goesFirst); diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index f4798683a47..7669c38a21a 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -246,6 +246,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { switch(this.getPhase()) { case UNTAP: //SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc()); + game.getPhaseHandler().setPlayersPriorityPermission(false); updateObservers(); PhaseUtil.handleUntap(game); break; diff --git a/src/main/java/forge/game/phase/PhaseUtil.java b/src/main/java/forge/game/phase/PhaseUtil.java index 1b4328bd196..a138154a7ec 100644 --- a/src/main/java/forge/game/phase/PhaseUtil.java +++ b/src/main/java/forge/game/phase/PhaseUtil.java @@ -103,7 +103,6 @@ public class PhaseUtil { // phase is skipped if (PhaseUtil.skipUntap(turn)) { - game.getPhaseHandler().setPlayersPriorityPermission(false); return; } @@ -112,8 +111,6 @@ public class PhaseUtil { // otherwise land seems to stay tapped when it is really untapped // AllZone.getHumanPlayer().getZone(ZoneType.Battlefield).updateObservers(); - - game.getPhaseHandler().setPlayersPriorityPermission(false); }