From 3d20e4dbefd0791c07a170a4c4ec164b29ce493c Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 10 Oct 2017 13:35:41 -0400 Subject: [PATCH] changed how phasing is handled --- Mage.Sets/src/mage/cards/e/Equipoise.java | 7 ++--- .../src/mage/cards/t/TeferisProtection.java | 6 +++- .../java/mage/game/permanent/Permanent.java | 4 ++- .../mage/game/permanent/PermanentImpl.java | 28 ++++++++++++++++--- .../main/java/mage/players/PlayerImpl.java | 13 ++++----- 5 files changed, 41 insertions(+), 17 deletions(-) diff --git a/Mage.Sets/src/mage/cards/e/Equipoise.java b/Mage.Sets/src/mage/cards/e/Equipoise.java index 7f3f5268041..a1606980a8d 100644 --- a/Mage.Sets/src/mage/cards/e/Equipoise.java +++ b/Mage.Sets/src/mage/cards/e/Equipoise.java @@ -55,8 +55,7 @@ import mage.target.TargetPlayer; public class Equipoise extends CardImpl { public Equipoise(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{W}"); - + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); // At the beginning of your upkeep, for each land target player controls in excess of the number you control, choose a land he or she controls, then the chosen permanents phase out. Repeat this process for artifacts and creatures. Ability ability = new BeginningOfUpkeepTriggeredAbility(new EquipoiseEffect(), TargetController.YOU, false); @@ -112,12 +111,12 @@ class EquipoiseEffect extends OneShotEffect { int numberTargetPlayer = game.getBattlefield().count(filter, source.getSourceId(), targetPlayer.getId(), game); int excess = numberTargetPlayer - numberController; if (excess > 0) { - FilterPermanent filterChoose = new FilterPermanent(cardType.toString().toLowerCase() + (excess > 1 ? "s":"") +" of target player"); + FilterPermanent filterChoose = new FilterPermanent(cardType.toString().toLowerCase() + (excess > 1 ? "s" : "") + " of target player"); filterChoose.add(new ControllerIdPredicate(targetPlayer.getId())); filterChoose.add(new CardTypePredicate(cardType)); Target target = new TargetPermanent(excess, excess, filterChoose, true); controller.chooseTarget(outcome, target, source, game); - for (UUID permanentId:target.getTargets()) { + for (UUID permanentId : target.getTargets()) { Permanent permanent = game.getPermanent(permanentId); if (permanent != null) { permanent.phaseOut(game); diff --git a/Mage.Sets/src/mage/cards/t/TeferisProtection.java b/Mage.Sets/src/mage/cards/t/TeferisProtection.java index a08ad3ba122..b9ae7df6090 100644 --- a/Mage.Sets/src/mage/cards/t/TeferisProtection.java +++ b/Mage.Sets/src/mage/cards/t/TeferisProtection.java @@ -171,7 +171,11 @@ class TeferisProtectionPhaseOutEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_CONTROLLED_PERMANENT, controller.getId(), game)) { - permanent.phaseOut(game); + Permanent attachedTo = game.getPermanent(permanent.getAttachedTo()); + // don't phase out auras directly if they're attached to your stuff + if (!(attachedTo != null && attachedTo.getControllerId().equals(controller.getId()))) { + permanent.phaseOut(game); + } } return true; } diff --git a/Mage/src/main/java/mage/game/permanent/Permanent.java b/Mage/src/main/java/mage/game/permanent/Permanent.java index aaf0b42d132..45e8226439f 100644 --- a/Mage/src/main/java/mage/game/permanent/Permanent.java +++ b/Mage/src/main/java/mage/game/permanent/Permanent.java @@ -78,9 +78,11 @@ public interface Permanent extends Card, Controllable { boolean isPhasedIn(); + boolean isPhasedOutIndirectly(); + boolean phaseIn(Game game); - boolean phaseIn(Game game, boolean indirectPhase); + boolean phaseIn(Game game, boolean onlyDirect); boolean phaseOut(Game game); diff --git a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java index 464cbabb422..c30051d825d 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java @@ -464,18 +464,31 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { } @Override - public boolean phaseIn(Game game) { - return phaseIn(game, false); + public boolean isPhasedOutIndirectly() { + return !phasedIn && indirectPhase; } @Override - public boolean phaseIn(Game game, boolean indirectPhase) { + public boolean phaseIn(Game game) { + return phaseIn(game, true); + } + + @Override + public boolean phaseIn(Game game, boolean onlyDirect) { if (!phasedIn) { - if (!replaceEvent(EventType.PHASE_IN, game)) { + if (!replaceEvent(EventType.PHASE_IN, game) + && ((onlyDirect && !indirectPhase) || (!onlyDirect))) { this.phasedIn = true; + this.indirectPhase = false; if (!game.isSimulation()) { game.informPlayers(getLogName() + " phased in"); } + for (UUID attachedId : this.getAttachments()) { + Permanent attachedPerm = game.getPermanent(attachedId); + if (attachedPerm != null) { + attachedPerm.phaseIn(game, false); + } + } fireEvent(EventType.PHASED_IN, game); return true; } @@ -492,7 +505,14 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { public boolean phaseOut(Game game, boolean indirectPhase) { if (phasedIn) { if (!replaceEvent(EventType.PHASE_OUT, game)) { + for (UUID attachedId : this.getAttachments()) { + Permanent attachedPerm = game.getPermanent(attachedId); + if (attachedPerm != null) { + attachedPerm.phaseOut(game, true); + } + } this.phasedIn = false; + this.indirectPhase = indirectPhase; if (!game.isSimulation()) { game.informPlayers(getLogName() + " phased out"); } diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index 1567246fdae..cb5e474cf28 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -1484,16 +1484,15 @@ public abstract class PlayerImpl implements Player, Serializable { // phasing out is known as phasing out "indirectly." An enchantment or Equipment // that phased out indirectly won't phase in by itself, but instead phases in // along with the card it's attached to. - for (UUID attachmentId : permanent.getAttachments()) { - Permanent attachment = game.getPermanent(attachmentId); - if (attachment != null) { - attachment.phaseOut(game); - } + Permanent attachedTo = game.getPermanent(permanent.getAttachedTo()); + if (!(attachedTo != null && attachedTo.getControllerId().equals(this.getId()))) { + permanent.phaseOut(game, false); } - permanent.phaseOut(game); } for (Permanent permanent : phasedOut) { - permanent.phaseIn(game); + if (!permanent.isPhasedOutIndirectly()) { + permanent.phaseIn(game); + } } }