diff --git a/Mage/src/main/java/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java index f0de6583bdb..8825e0617ac 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java @@ -49,6 +49,8 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR private UUID onlyIfControlledByPlayer; private String targetName; + // used for Telekinesis - skips next two untap steps if true + private boolean twoSteps; // holds the info what target was already handled in Untap of its controller private final Map handledTargetsDuringTurn = new HashMap<>(); @@ -63,7 +65,7 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR } public DontUntapInControllersNextUntapStepTargetEffect(String targetName) { - this(targetName, null); + this(targetName, false, null); } /** @@ -73,14 +75,20 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR * controlled by that controller, null = it works for all players */ public DontUntapInControllersNextUntapStepTargetEffect(String targetName, UUID onlyIfControlledByPlayer) { + this(targetName, false, onlyIfControlledByPlayer); + } + + public DontUntapInControllersNextUntapStepTargetEffect(String targetName, boolean twoSteps, UUID onlyIfControlledByPlayer) { super(Duration.Custom, Outcome.Detriment, false, true); this.targetName = targetName; + this.twoSteps = twoSteps; this.onlyIfControlledByPlayer = onlyIfControlledByPlayer; } public DontUntapInControllersNextUntapStepTargetEffect(final DontUntapInControllersNextUntapStepTargetEffect effect) { super(effect); this.targetName = effect.targetName; + this.twoSteps = effect.twoSteps; this.handledTargetsDuringTurn.putAll(effect.handledTargetsDuringTurn); this.onlyIfControlledByPlayer = effect.onlyIfControlledByPlayer; } @@ -112,7 +120,7 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR @Override public boolean applies(GameEvent event, Ability source, Game game) { - // the check if a permanent untap pahse is already handled is needed if multiple effects are added to prevent untap in next untap step of controller + // the check if a permanent untap phase is already handled is needed if multiple effects are added to prevent untap in next untap step of controller // if we don't check it for every untap step of a turn only one effect would be consumed instead of all be valid for the next untap step if (event.getType() == EventType.UNTAP_STEP) { boolean allHandled = true; @@ -127,13 +135,14 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR allHandled = false; } else if (!handledTargetsDuringTurn.get(targetId)) { // if it was already ready to be handled on an previous Untap step set it to done if not already so - handledTargetsDuringTurn.put(targetId, true); + handledTargetsDuringTurn.put(targetId, !twoSteps); } } else { allHandled = false; } } } + if (allHandled) { discard(); } @@ -146,7 +155,7 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent != null && game.getActivePlayerId().equals(permanent.getControllerId())) { if ((onlyIfControlledByPlayer == null) || game.getActivePlayerId().equals(onlyIfControlledByPlayer)) { // If onlyIfControlledByPlayer is set, then don't apply unless we're currently controlled by the specified player. - handledTargetsDuringTurn.put(event.getTargetId(), true); + handledTargetsDuringTurn.put(event.getTargetId(), !twoSteps); return true; } } @@ -162,11 +171,11 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR } if (targetName != null && !targetName.isEmpty()) { if (targetName.equals("Those creatures") || targetName.equals("They")) { - return targetName + " don't untap during their controller's next untap step"; + return targetName + " don't untap during their controller's next " + (twoSteps ? "two " : "") + "untap step" + (twoSteps ? "s" : ""); } else - return targetName + " doesn't untap during its controller's next untap step"; + return targetName + " doesn't untap during its controller's next " + (twoSteps ? "two " : "") + "untap step" + (twoSteps ? "s" : ""); } else { - return "target " + (mode == null ? "creature" : mode.getTargets().get(0).getTargetName()) + " doesn't untap during its controller's next untap step"; + return "target " + (mode == null ? "creature" : mode.getTargets().get(0).getTargetName()) + " doesn't untap during its controller's next " + (twoSteps ? "two " : "") + "untap step" + (twoSteps ? "s" : ""); } }