diff --git a/Mage.Sets/src/mage/cards/g/GraspOfFate.java b/Mage.Sets/src/mage/cards/g/GraspOfFate.java index 395751af315..1b809a6cd06 100644 --- a/Mage.Sets/src/mage/cards/g/GraspOfFate.java +++ b/Mage.Sets/src/mage/cards/g/GraspOfFate.java @@ -1,33 +1,26 @@ - package mage.cards.g; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.delayed.OnLeaveReturnExiledToBattlefieldAbility; -import mage.abilities.condition.common.SourceOnBattlefieldCondition; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; -import mage.abilities.effects.common.ExileTargetEffect; +import mage.abilities.effects.common.ExileUntilSourceLeavesEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetPermanent; import mage.target.targetadjustment.TargetAdjuster; -import mage.util.CardUtil; +import mage.target.targetpointer.EachTargetPointer; import java.util.UUID; /** - * @author fireshoes + * @author awjackson */ public final class GraspOfFate extends CardImpl { @@ -35,7 +28,10 @@ public final class GraspOfFate extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{W}"); // When Grasp of Fate enters the battlefield, for each opponent, exile up to one target nonland permanent that player controls until Grasp of Fate leaves the battlefield. - Ability ability = new EntersBattlefieldTriggeredAbility(new GraspOfFateExileEffect()); + Ability ability = new EntersBattlefieldTriggeredAbility(new ExileUntilSourceLeavesEffect("") + .setTargetPointer(new EachTargetPointer()) + .setText("for each opponent, exile up to one target nonland permanent that player controls until {this} leaves the battlefield") + ); ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility())); ability.setTargetAdjuster(GraspOfFateAdjuster.instance); this.addAbility(ability); @@ -70,29 +66,3 @@ enum GraspOfFateAdjuster implements TargetAdjuster { } } } - -class GraspOfFateExileEffect extends OneShotEffect { - - public GraspOfFateExileEffect() { - super(Outcome.Benefit); - this.staticText = "for each opponent, exile up to one target nonland permanent that player controls until {this} leaves the battlefield"; - } - - public GraspOfFateExileEffect(final GraspOfFateExileEffect effect) { - super(effect); - } - - @Override - public GraspOfFateExileEffect copy() { - return new GraspOfFateExileEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null) { // 11/4/2015: If Grasp of Fate leaves the battlefield before its triggered ability resolves, no nonland permanents will be exiled. - return new ConditionalOneShotEffect(new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getIdName(), Zone.BATTLEFIELD, true), SourceOnBattlefieldCondition.instance).apply(game, source); - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/m/MindbreakTrap.java b/Mage.Sets/src/mage/cards/m/MindbreakTrap.java index 4382eec14d8..04cd4fc4e1b 100644 --- a/Mage.Sets/src/mage/cards/m/MindbreakTrap.java +++ b/Mage.Sets/src/mage/cards/m/MindbreakTrap.java @@ -22,7 +22,7 @@ import java.util.UUID; */ public final class MindbreakTrap extends CardImpl { - private static final FilterSpell filter = new FilterSpell("spell to exile"); + private static final FilterSpell filter = new FilterSpell("spells"); public MindbreakTrap(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}{U}"); @@ -33,7 +33,7 @@ public final class MindbreakTrap extends CardImpl { // Exile any number of target spells. this.getSpellAbility().addTarget(new TargetSpell(0, Integer.MAX_VALUE, filter)); - this.getSpellAbility().addEffect(new ExileTargetEffect("Exile any number of target spells", true)); + this.getSpellAbility().addEffect(new ExileTargetEffect("Exile any number of target spells")); } private MindbreakTrap(final MindbreakTrap card) { diff --git a/Mage.Sets/src/mage/cards/r/RatsFeast.java b/Mage.Sets/src/mage/cards/r/RatsFeast.java index 38bc8555ebc..04005378b42 100644 --- a/Mage.Sets/src/mage/cards/r/RatsFeast.java +++ b/Mage.Sets/src/mage/cards/r/RatsFeast.java @@ -21,9 +21,7 @@ public final class RatsFeast extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{B}"); // Exile X target cards from a single graveyard. - this.getSpellAbility().addEffect(new ExileTargetEffect( - "Exile X target cards from a single graveyard", true - )); + this.getSpellAbility().addEffect(new ExileTargetEffect("Exile X target cards from a single graveyard")); this.getSpellAbility().setTargetAdjuster(RatsFeastAdjuster.instance); } @@ -46,4 +44,4 @@ enum RatsFeastAdjuster implements TargetAdjuster { ability.getTargets().clear(); ability.addTarget(new TargetCardInASingleGraveyard(xValue, xValue, StaticFilters.FILTER_CARD_CARDS)); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/r/RiseOfExtus.java b/Mage.Sets/src/mage/cards/r/RiseOfExtus.java index 1f9769c771d..0aafdd8cf98 100644 --- a/Mage.Sets/src/mage/cards/r/RiseOfExtus.java +++ b/Mage.Sets/src/mage/cards/r/RiseOfExtus.java @@ -6,9 +6,11 @@ import mage.abilities.hint.common.OpenSideboardHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.StaticFilters; +import mage.filter.FilterCard; +import mage.filter.common.FilterInstantOrSorceryCard; import mage.target.common.TargetCardInGraveyard; import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.SecondTargetPointer; import java.util.UUID; @@ -17,16 +19,18 @@ import java.util.UUID; */ public final class RiseOfExtus extends CardImpl { + private static final FilterCard filter = new FilterInstantOrSorceryCard("instant or sorcery card from a graveyard"); + public RiseOfExtus(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{W/B}{W/B}"); - // Exile target creature. Exile up to one target instant or sorcery card from a graveyard. - this.getSpellAbility().addEffect(new ExileTargetEffect("Exile target creature. " + - "Exile up to one target instant or sorcery card from a graveyard.", true)); + // Exile target creature. this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().addTarget(new TargetCardInGraveyard( - 0, 1, StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY - )); + this.getSpellAbility().addEffect(new ExileTargetEffect()); + + // Exile up to one target instant or sorcery card from a graveyard. + this.getSpellAbility().addTarget(new TargetCardInGraveyard(0, 1, filter)); + this.getSpellAbility().addEffect(new ExileTargetEffect().setTargetPointer(new SecondTargetPointer())); // Learn. this.getSpellAbility().addEffect(new LearnEffect().concatBy("
")); diff --git a/Mage/src/main/java/mage/abilities/effects/common/ExileTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ExileTargetEffect.java index ebb9ea059ee..16efa142716 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ExileTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ExileTargetEffect.java @@ -29,18 +29,12 @@ public class ExileTargetEffect extends OneShotEffect { private final Zone onlyFromZone; private String exileZone = null; private UUID exileId = null; - protected boolean multitargetHandling; private boolean toSourceExileZone = false; // exile the targets to a source object specific exile zone (takes care of zone change counter) private boolean withName = true; public ExileTargetEffect(String effectText) { - this(effectText, false); - } - - public ExileTargetEffect(String effectText, boolean multitargetHandling) { this(); this.staticText = effectText; - this.multitargetHandling = multitargetHandling; } /** @@ -56,15 +50,10 @@ public class ExileTargetEffect extends OneShotEffect { } public ExileTargetEffect(UUID exileId, String exileZone, Zone onlyFromZone) { - this(exileId, exileZone, onlyFromZone, false); - } - - public ExileTargetEffect(UUID exileId, String exileZone, Zone onlyFromZone, boolean multitargetHandling) { super(Outcome.Exile); this.exileZone = exileZone; this.exileId = exileId; this.onlyFromZone = onlyFromZone; - this.multitargetHandling = multitargetHandling; } public ExileTargetEffect(final ExileTargetEffect effect) { @@ -72,7 +61,6 @@ public class ExileTargetEffect extends OneShotEffect { this.exileZone = effect.exileZone; this.exileId = effect.exileId; this.onlyFromZone = effect.onlyFromZone; - this.multitargetHandling = effect.multitargetHandling; this.toSourceExileZone = effect.toSourceExileZone; this.withName = effect.withName; } @@ -96,65 +84,29 @@ public class ExileTargetEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { Set toExile = new LinkedHashSet<>(); - if (multitargetHandling - && targetPointer instanceof FirstTargetPointer - && (source.getTargets().size() > 1 - || (source.getTargets().size() > 0 - && source.getTargets().get(0).getTargets().size() > 1))) { - for (Target target : source.getTargets()) { - for (UUID targetId : target.getTargets()) { - Permanent permanent = game.getPermanent(targetId); - if (permanent != null - && permanent.isPhasedIn()) { - Zone currentZone = game.getState().getZone(permanent.getId()); - if (currentZone != Zone.EXILED - && (onlyFromZone == null - || onlyFromZone == Zone.BATTLEFIELD)) { - toExile.add(permanent); - } - } else { - Card card = game.getCard(targetId); - if (card != null) { - Zone currentZone = game.getState().getZone(card.getId()); - if (currentZone != Zone.EXILED - && (onlyFromZone == null - || onlyFromZone == currentZone)) { - toExile.add(card); - } - } else { - StackObject stackObject = game.getStack().getStackObject(targetId); - if (stackObject instanceof Spell) { - toExile.add((Spell) stackObject); - } - } - } + for (UUID targetId : getTargetPointer().getTargets(game, source)) { + Permanent permanent = game.getPermanent(targetId); + if (permanent != null + && permanent.isPhasedIn()) { + Zone currentZone = game.getState().getZone(permanent.getId()); + if (currentZone != Zone.EXILED + && (onlyFromZone == null + || onlyFromZone == Zone.BATTLEFIELD)) { + toExile.add(permanent); } - } - } else { - for (UUID targetId : getTargetPointer().getTargets(game, source)) { - Permanent permanent = game.getPermanent(targetId); - if (permanent != null - && permanent.isPhasedIn()) { - Zone currentZone = game.getState().getZone(permanent.getId()); + } else { + Card card = game.getCard(targetId); + if (card != null) { + Zone currentZone = game.getState().getZone(card.getId()); if (currentZone != Zone.EXILED && (onlyFromZone == null - || onlyFromZone == Zone.BATTLEFIELD)) { - toExile.add(permanent); + || onlyFromZone == currentZone)) { + toExile.add(card); } } else { - Card card = game.getCard(targetId); - if (card != null) { - Zone currentZone = game.getState().getZone(card.getId()); - if (currentZone != Zone.EXILED - && (onlyFromZone == null - || onlyFromZone == currentZone)) { - toExile.add(card); - } - } else { - StackObject stackObject = game.getStack().getStackObject(targetId); - if (stackObject instanceof Spell) { - toExile.add((Spell) stackObject); - } + StackObject stackObject = game.getStack().getStackObject(targetId); + if (stackObject instanceof Spell) { + toExile.add((Spell) stackObject); } } }