From ff3652c766fcad68db55e1c5616f5f77ffeb7349 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Thu, 7 Mar 2013 14:58:51 +0000 Subject: [PATCH] restart game effect (from Karn Liberated) will set mulliganned flag to false --- .../forge/control/input/InputMulligan.java | 2 +- src/main/java/forge/game/GameNew.java | 224 +++++++++--------- src/main/java/forge/game/GameState.java | 2 +- 3 files changed, 112 insertions(+), 116 deletions(-) diff --git a/src/main/java/forge/control/input/InputMulligan.java b/src/main/java/forge/control/input/InputMulligan.java index 65989ff448f..6524268240d 100644 --- a/src/main/java/forge/control/input/InputMulligan.java +++ b/src/main/java/forge/control/input/InputMulligan.java @@ -186,7 +186,7 @@ public class InputMulligan extends Input { VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(next); SDisplayUtil.showTab(nextField); - game.setMulliganComplete(); + game.setMulliganned(true); Singletons.getModel().getMatch().getInput().clearInput(); Singletons.getModel().getMatch().getInput().resetInput(); } diff --git a/src/main/java/forge/game/GameNew.java b/src/main/java/forge/game/GameNew.java index 45ed843e9b5..165d5c34013 100644 --- a/src/main/java/forge/game/GameNew.java +++ b/src/main/java/forge/game/GameNew.java @@ -191,8 +191,6 @@ public class GameNew { removedAnteCards.put(player, myRemovedAnteCards); } - - if (rAICards.size() > 0) { String message = buildFourColumnList("AI deck contains the following cards that it can't play or may be buggy:", rAICards); if (GameType.Quest == game.getType()) { @@ -211,7 +209,116 @@ public class GameNew { JOptionPane.showMessageDialog(null, ante.toString(), "", JOptionPane.INFORMATION_MESSAGE); } - GameNew.actuateGame(match, game, false); + // Deciding which cards go to ante + if (preferences.getPrefBoolean(FPref.UI_ANTE)) { + final String nl = System.getProperty("line.separator"); + final StringBuilder msg = new StringBuilder(); + for (final Player p : game.getPlayers()) { + + final List lib = p.getCardsIn(ZoneType.Library); + Predicate goodForAnte = Predicates.not(CardPredicates.Presets.BASIC_LANDS); + Card ante = Aggregates.random(Iterables.filter(lib, goodForAnte)); + if (ante == null) { + throw new RuntimeException(p + " library is empty."); + } + game.getGameLog().add("Ante", p + " anted " + ante, 0); + VAntes.SINGLETON_INSTANCE.addAnteCard(p, ante); + game.getAction().moveTo(ZoneType.Ante, ante); + msg.append(p.getName()).append(" ante: ").append(ante).append(nl); + } + JOptionPane.showMessageDialog(null, msg, "Ante", JOptionPane.INFORMATION_MESSAGE); + } + + determineFirstTurnPlayer(match.getLastGameOutcome(), game); + + // Draw cards + for (final Player p1 : game.getPlayers()) { + p1.drawCards(p1.getMaxHandSize()); + } + + Thread thGame = new GameInputUpdatesThread(match, game); + thGame.setName("Game input updater"); + thGame.start(); + } + + // ultimate of Karn the Liberated + public static void restartGame(final MatchController match, final GameState game, final Player startingTurn, Map> playerLibraries) { + + Map players = match.getPlayers(); + Map playersConditions = new HashMap(); + + for (Player p : game.getPlayers()) { + playersConditions.put(p, players.get(p.getLobbyPlayer())); + } + + game.setMulliganned(false); + match.getInput().clearInput(); + + //Card.resetUniqueNumber(); + // need this code here, otherwise observables fail + forge.card.trigger.Trigger.resetIDs(); + TriggerHandler trigHandler = game.getTriggerHandler(); + trigHandler.clearTriggerSettings(); + trigHandler.clearDelayedTrigger(); + trigHandler.cleanUpTemporaryTriggers(); + trigHandler.suppressMode(TriggerType.ChangesZone); + + game.getStack().reset(); + GameAction action = game.getAction(); + + + for (Entry p : playersConditions.entrySet()) { + final Player player = p.getKey(); + player.setStartingLife(p.getValue().getStartingLife()); + player.setNumLandsPlayed(0); + putCardsOnBattlefield(player, p.getValue().getCardsOnBattlefield(player)); + + PlayerZone library = player.getZone(ZoneType.Library); + List newLibrary = playerLibraries.get(player); + for (Card c : newLibrary) { + action.moveTo(library, c); + } + + player.shuffle(); + player.getZone(ZoneType.Battlefield).updateObservers(); + player.updateObservers(); + player.getZone(ZoneType.Hand).updateObservers(); + } + + trigHandler.clearSuppression(TriggerType.ChangesZone); + + PhaseHandler phaseHandler = game.getPhaseHandler(); + phaseHandler.setPlayerTurn(startingTurn); + + // Draw cards + for (final Player p : game.getPlayers()) { + p.drawCards(p.getMaxHandSize()); + } + } + + /** + * TODO: Write javadoc for this method. + * @param match + * @param game + */ + private static void determineFirstTurnPlayer(final GameOutcome lastGameOutcome, final GameState game) { + // Only cut/coin toss if it's the first game of the match + Player goesFirst; + Player humanPlayer = Singletons.getControl().getPlayer(); + boolean isFirstGame = lastGameOutcome == null; + if (isFirstGame) { + goesFirst = GameNew.seeWhoPlaysFirstDice(game); + } else { + + goesFirst = lastGameOutcome.isWinner(humanPlayer.getLobbyPlayer()) ? humanPlayer.getOpponent() : humanPlayer; + } + 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); + } + goesFirst = willPlay ? goesFirst : goesFirst.getOpponent(); + game.getPhaseHandler().setPlayerTurn(goesFirst); } private static void initVariantsZones(final Player player, final PlayerStartConditions psc) { @@ -279,117 +386,6 @@ public class GameNew { } - // ultimate of Karn the Liberated - public static void restartGame(final MatchController match, final GameState game, final Player startingTurn, Map> playerLibraries) { - - Map players = match.getPlayers(); - Map playersConditions = new HashMap(); - - for (Player p : game.getPlayers()) { - playersConditions.put(p, players.get(p.getLobbyPlayer())); - } - - match.getInput().clearInput(); - - //Card.resetUniqueNumber(); - // need this code here, otherwise observables fail - forge.card.trigger.Trigger.resetIDs(); - TriggerHandler trigHandler = game.getTriggerHandler(); - trigHandler.clearTriggerSettings(); - trigHandler.clearDelayedTrigger(); - trigHandler.cleanUpTemporaryTriggers(); - trigHandler.suppressMode(TriggerType.ChangesZone); - - game.getStack().reset(); - GameAction action = game.getAction(); - - - for (Entry p : playersConditions.entrySet()) { - final Player player = p.getKey(); - player.setStartingLife(p.getValue().getStartingLife()); - player.setNumLandsPlayed(0); - putCardsOnBattlefield(player, p.getValue().getCardsOnBattlefield(player)); - - PlayerZone library = player.getZone(ZoneType.Library); - List newLibrary = playerLibraries.get(player); - for (Card c : newLibrary) { - action.moveTo(library, c); - } - - player.shuffle(); - player.getZone(ZoneType.Battlefield).updateObservers(); - player.updateObservers(); - player.getZone(ZoneType.Hand).updateObservers(); - } - - trigHandler.clearSuppression(TriggerType.ChangesZone); - - PhaseHandler phaseHandler = game.getPhaseHandler(); - phaseHandler.setPlayerTurn(startingTurn); - - GameNew.actuateGame(match, game, true); - } - - /** - * This must be separated from the newGame method since life totals and - * player details could be adjusted before the game is started. - * - * That process (also cleanup and observer updates) should be done in - * newGame, then when all is ready, call this function. - * @param isRestartedGame Whether the actuated game is the first start or a restart - */ - private static void actuateGame(final MatchController match, final GameState game, boolean isRestartedGame) { - if (!isRestartedGame) { - // Deciding which cards go to ante - if (preferences.getPrefBoolean(FPref.UI_ANTE)) { - final String nl = System.getProperty("line.separator"); - final StringBuilder msg = new StringBuilder(); - for (final Player p : game.getPlayers()) { - - final List lib = p.getCardsIn(ZoneType.Library); - Predicate goodForAnte = Predicates.not(CardPredicates.Presets.BASIC_LANDS); - Card ante = Aggregates.random(Iterables.filter(lib, goodForAnte)); - if (ante == null) { - throw new RuntimeException(p + " library is empty."); - } - game.getGameLog().add("Ante", p + " anted " + ante, 0); - VAntes.SINGLETON_INSTANCE.addAnteCard(p, ante); - game.getAction().moveTo(ZoneType.Ante, ante); - msg.append(p.getName()).append(" ante: ").append(ante).append(nl); - } - JOptionPane.showMessageDialog(null, msg, "Ante", JOptionPane.INFORMATION_MESSAGE); - } - - GameOutcome lastGameOutcome = match.getLastGameOutcome(); - // Only cut/coin toss if it's the first game of the match - Player goesFirst; - Player humanPlayer = Singletons.getControl().getPlayer(); - boolean isFirstGame = lastGameOutcome == null; - if (isFirstGame) { - goesFirst = GameNew.seeWhoPlaysFirstDice(game); - } else { - - goesFirst = lastGameOutcome.isWinner(humanPlayer.getLobbyPlayer()) ? humanPlayer.getOpponent() : humanPlayer; - } - 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); - } - goesFirst = willPlay ? goesFirst : goesFirst.getOpponent(); - game.getPhaseHandler().setPlayerTurn(goesFirst); - } - - // Draw cards - for (final Player p : game.getPlayers()) { - p.drawCards(p.getMaxHandSize()); - } - - Thread thGame = new GameInputUpdatesThread(match, game); - thGame.setName("Game input updater"); - thGame.start(); - } // newGame() - private static String buildFourColumnList(String firstLine, Iterable cAnteRemoved) { StringBuilder sb = new StringBuilder(firstLine); int i = 0; diff --git a/src/main/java/forge/game/GameState.java b/src/main/java/forge/game/GameState.java index 5f84a1640c2..88a1c9903f5 100644 --- a/src/main/java/forge/game/GameState.java +++ b/src/main/java/forge/game/GameState.java @@ -669,5 +669,5 @@ public class GameState { public boolean mulliganned = false; public boolean hasMulliganned(){ return mulliganned; } - public void setMulliganComplete() { mulliganned = true; } + public void setMulliganned(boolean value) { mulliganned = value; } }