From f99e0b3b4becac25c3b485858c08e32df7079dec Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Mon, 27 May 2013 13:29:37 +0000 Subject: [PATCH] inlined handleUntap, fixed release control problem --- .../ability/effects/ControlPlayerEffect.java | 2 +- .../java/forge/game/phase/PhaseHandler.java | 29 ++++++++++++- src/main/java/forge/game/phase/PhaseUtil.java | 42 +------------------ 3 files changed, 30 insertions(+), 43 deletions(-) diff --git a/src/main/java/forge/card/ability/effects/ControlPlayerEffect.java b/src/main/java/forge/card/ability/effects/ControlPlayerEffect.java index 80434068a89..c593c085795 100644 --- a/src/main/java/forge/card/ability/effects/ControlPlayerEffect.java +++ b/src/main/java/forge/card/ability/effects/ControlPlayerEffect.java @@ -39,7 +39,7 @@ public class ControlPlayerEffect extends SpellAbilityEffect { pTarget.obeyNewMaster(activator.getLobbyPlayer().createControllerFor(pTarget)); // on following cleanup release control - game.getCleanup().addAt(new Command() { + game.getEndOfTurn().addUntil(new Command() { @Override public void run() { pTarget.releaseControl(); diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index d64b1a68ee8..2c6183f0a71 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -18,6 +18,7 @@ package forge.game.phase; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Stack; import java.util.concurrent.atomic.AtomicBoolean; @@ -25,9 +26,11 @@ import java.util.concurrent.atomic.AtomicBoolean; import com.esotericsoftware.minlog.Log; import forge.Card; +import forge.CardLists; import forge.FThreads; import forge.GameEventType; import forge.Singletons; +import forge.CardPredicates.Presets; import forge.card.trigger.TriggerType; import forge.game.GameState; import forge.game.GameType; @@ -313,7 +316,31 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { case UNTAP: //SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc()); game.getPhaseHandler().setPlayersPriorityPermission(false); - PhaseUtil.handleUntap(game); + + game.getCombat().reset(playerTurn); + + // Tokens starting game in play should suffer from Sum. Sickness + final List list = playerTurn.getCardsIncludePhasingIn(ZoneType.Battlefield); + for (final Card c : list) { + if (playerTurn.getTurn() > 0 || !c.isStartsGameInPlay()) { + c.setSickness(false); + } + } + playerTurn.incrementTurn(); + + game.getAction().resetActivationsPerTurn(); + + final List lands = CardLists.filter(playerTurn.getLandsInPlay(), Presets.UNTAPPED); + playerTurn.setNumPowerSurgeLands(lands.size()); + + // anything before this point happens regardless of whether the Untap + // phase is skipped + + if (!PhaseUtil.isSkipUntap(playerTurn)) { + game.getUntap().executeUntil(playerTurn); + game.getUntap().executeAt(); + } + break; case UPKEEP: diff --git a/src/main/java/forge/game/phase/PhaseUtil.java b/src/main/java/forge/game/phase/PhaseUtil.java index 10080d0b9c3..6e07e0f77ca 100644 --- a/src/main/java/forge/game/phase/PhaseUtil.java +++ b/src/main/java/forge/game/phase/PhaseUtil.java @@ -60,7 +60,7 @@ public class PhaseUtil { * a {@link forge.game.player.Player} object. * @return a boolean. */ - private static boolean skipUntap(final Player p) { + static boolean isSkipUntap(final Player p) { if (p.hasKeyword("Skip your next untap step.")) { p.removeKeyword("Skip your next untap step."); @@ -74,46 +74,6 @@ public class PhaseUtil { return false; } - /** - *

- * handleUntap. - *

- */ - public static void handleUntap(GameState game) { - final PhaseHandler ph = game.getPhaseHandler(); - final Player turn = ph.getPlayerTurn(); - - game.getCombat().reset(turn); - - // Tokens starting game in play should suffer from Sum. Sickness - final List list = turn.getCardsIncludePhasingIn(ZoneType.Battlefield); - for (final Card c : list) { - if (turn.getTurn() > 0 || !c.isStartsGameInPlay()) { - c.setSickness(false); - } - } - turn.incrementTurn(); - - game.getAction().resetActivationsPerTurn(); - - final List lands = CardLists.filter(turn.getLandsInPlay(), Presets.UNTAPPED); - turn.setNumPowerSurgeLands(lands.size()); - - // anything before this point happens regardless of whether the Untap - // phase is skipped - - if (PhaseUtil.skipUntap(turn)) { - return; - } - - game.getUntap().executeUntil(turn); - game.getUntap().executeAt(); - - // otherwise land seems to stay tapped when it is really untapped - // AllZone.getHumanPlayer().getZone(ZoneType.Battlefield).updateObservers(); - } - - // ********* Declare Attackers ***********