diff --git a/Mage.Sets/src/mage/cards/p/Pandemonium.java b/Mage.Sets/src/mage/cards/p/Pandemonium.java index 82d3bfefe32..581cb03e134 100644 --- a/Mage.Sets/src/mage/cards/p/Pandemonium.java +++ b/Mage.Sets/src/mage/cards/p/Pandemonium.java @@ -1,7 +1,6 @@ package mage.cards.p; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -16,39 +15,31 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetAnyTarget; +import mage.target.targetadjustment.TargetAdjuster; + +import java.util.UUID; /** - * * @author LevelX2 */ public final class Pandemonium extends CardImpl { - private final UUID originalId; - public Pandemonium(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}"); // Whenever a creature enters the battlefield, that creature's controller may have it deal damage equal to its power to any target of their choice. - Ability ability = new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new PandemoniumEffect(), StaticFilters.FILTER_PERMANENT_CREATURE, false, SetTargetPointer.PERMANENT, ""); + Ability ability = new EntersBattlefieldAllTriggeredAbility( + Zone.BATTLEFIELD, new PandemoniumEffect(), + StaticFilters.FILTER_PERMANENT_CREATURE, + false, SetTargetPointer.PERMANENT, "" + ); ability.addTarget(new TargetAnyTarget()); - originalId = ability.getOriginalId(); + ability.setTargetAdjuster(PandemoniumAdjuster.instance); this.addAbility(ability); } public Pandemonium(final Pandemonium card) { super(card); - this.originalId = card.originalId; - } - - @Override - public void adjustTargets(Ability ability, Game game) { - if (ability.getOriginalId().equals(originalId)) { - UUID creatureId = ability.getEffects().get(0).getTargetPointer().getFirst(game, ability); - Permanent creature = game.getPermanent(creatureId); - if (creature != null) { - ability.getTargets().get(0).setTargetController(creature.getControllerId()); - } - } } @Override @@ -57,6 +48,19 @@ public final class Pandemonium extends CardImpl { } } +enum PandemoniumAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + UUID creatureId = ability.getEffects().get(0).getTargetPointer().getFirst(game, ability); + Permanent creature = game.getPermanent(creatureId); + if (creature != null) { + ability.getTargets().get(0).setTargetController(creature.getControllerId()); + } + } +} + class PandemoniumEffect extends OneShotEffect { public PandemoniumEffect() { diff --git a/Mage.Sets/src/mage/cards/p/PartWater.java b/Mage.Sets/src/mage/cards/p/PartWater.java index 0e7c6c11b1e..47afdfb31e1 100644 --- a/Mage.Sets/src/mage/cards/p/PartWater.java +++ b/Mage.Sets/src/mage/cards/p/PartWater.java @@ -1,9 +1,7 @@ package mage.cards.p; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.SpellAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.IslandwalkAbility; @@ -11,34 +9,26 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.target.common.TargetCreaturePermanent; +import mage.target.targetadjustment.TargetAdjuster; + +import java.util.UUID; /** - * * @author fireshoes */ public final class PartWater extends CardImpl { public PartWater(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{X}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{U}"); // X target creatures gain islandwalk until end of turn. Effect effect = new GainAbilityTargetEffect(new IslandwalkAbility(false), Duration.EndOfTurn); effect.setText("X target creatures gain islandwalk until end of turn"); this.getSpellAbility().getEffects().add(effect); - this.getSpellAbility().getTargets().add(new TargetCreaturePermanent(1,1)); - } - - @Override - public void adjustTargets(Ability ability, Game game) { - if (ability instanceof SpellAbility) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures gain islandwalk until end of turn"); - ability.getTargets().add(new TargetCreaturePermanent(0, xValue, filter, false)); - } + this.getSpellAbility().getTargets().add(new TargetCreaturePermanent()); + this.getSpellAbility().setTargetAdjuster(PartWaterAdjuster.instance); } public PartWater(final PartWater card) { @@ -50,3 +40,13 @@ public final class PartWater extends CardImpl { return new PartWater(this); } } + +enum PartWaterAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + ability.getTargets().clear(); + ability.getTargets().add(new TargetCreaturePermanent(ability.getManaCostsToPay().getX())); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/p/PolukranosWorldEater.java b/Mage.Sets/src/mage/cards/p/PolukranosWorldEater.java index 6f6b1ca6b6b..0fa30f941f0 100644 --- a/Mage.Sets/src/mage/cards/p/PolukranosWorldEater.java +++ b/Mage.Sets/src/mage/cards/p/PolukranosWorldEater.java @@ -1,9 +1,6 @@ package mage.cards.p; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility; @@ -12,47 +9,44 @@ import mage.abilities.keyword.MonstrosityAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.SuperType; -import mage.constants.TargetController; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.permanent.ControllerPredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.Target; import mage.target.common.TargetCreaturePermanentAmount; +import mage.target.targetadjustment.TargetAdjuster; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; /** - * * * The value of X in Polukranos's last ability is equal to the value chosen - * for X when its activated ability was activated. - * + * for X when its activated ability was activated. + *
* * The number of targets chosen for the triggered ability must be at least one - * (if X wasn't 0) and at most X. You choose the division of damage as you put - * the ability on the stack, not as it resolves. Each target must be assigned - * at least 1 damage. In multiplayer games, you may choose creatures controlled - * by different opponents. - * + * (if X wasn't 0) and at most X. You choose the division of damage as you put + * the ability on the stack, not as it resolves. Each target must be assigned + * at least 1 damage. In multiplayer games, you may choose creatures controlled + * by different opponents. + *
* * If some, but not all, of the ability's targets become illegal, you can't change - * the division of damage. Damage that would've been dealt to illegal targets - * simply isn't dealt. - * + * the division of damage. Damage that would've been dealt to illegal targets + * simply isn't dealt. + *
* * As Polukranos's triggered ability resolves, Polukranos deals damage first, then
- * the target creatures do. Although no creature will die until after the ability
- * finishes resolving, the order could matter if Polukranos has wither or infect.
+ * the target creatures do. Although no creature will die until after the ability
+ * finishes resolving, the order could matter if Polukranos has wither or infect.
*
* @author LevelX2
*/
public final class PolukranosWorldEater extends CardImpl {
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
- static {
- filter.add(new ControllerPredicate(TargetController.OPPONENT));
- }
-
public PolukranosWorldEater(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.HYDRA);
@@ -61,20 +55,11 @@ public final class PolukranosWorldEater extends CardImpl {
// {X}{X}{G}: Monstrosity X.
this.addAbility(new MonstrosityAbility("{X}{X}{G}", Integer.MAX_VALUE));
+
// When Polukranos, World Eater becomes monstrous, it deals X damage divided as you choose among any number of target creatures your opponents control. Each of those creatures deals damage equal to its power to Polukranos.
Ability ability = new BecomesMonstrousSourceTriggeredAbility(new PolukranosWorldEaterEffect());
- ability.addTarget(new TargetCreaturePermanentAmount(1, filter));
+ ability.setTargetAdjuster(PolukranosWorldEaterAdjuster.instance);
this.addAbility(ability);
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof BecomesMonstrousSourceTriggeredAbility) {
- int xValue = ((BecomesMonstrousSourceTriggeredAbility) ability).getMonstrosityValue();
- ability.getTargets().clear();
- ability.addTarget(new TargetCreaturePermanentAmount(xValue, filter));
- }
}
public PolukranosWorldEater(final PolukranosWorldEater card) {
@@ -87,6 +72,17 @@ public final class PolukranosWorldEater extends CardImpl {
}
}
+enum PolukranosWorldEaterAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ int xValue = ((BecomesMonstrousSourceTriggeredAbility) ability).getMonstrosityValue();
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCreaturePermanentAmount(xValue, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE));
+ }
+}
+
class PolukranosWorldEaterEffect extends OneShotEffect {
public PolukranosWorldEaterEffect() {
@@ -108,7 +104,7 @@ class PolukranosWorldEaterEffect extends OneShotEffect {
if (!source.getTargets().isEmpty()) {
Target multiTarget = source.getTargets().get(0);
Set
if this spell was kicked, target player discards two cards"));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- if (KickedCondition.instance.apply(game, ability)) {
- ability.addTarget(new TargetPlayer());
- }
- }
+ this.getSpellAbility().setTargetAdjuster(ProbeAdjuster.instance);
}
public Probe(final Probe card) {
@@ -54,3 +45,15 @@ public final class Probe extends CardImpl {
return new Probe(this);
}
}
+
+enum ProbeAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ if (KickedCondition.instance.apply(game, ability)) {
+ ability.addTarget(new TargetPlayer());
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/p/ProfaneCommand.java b/Mage.Sets/src/mage/cards/p/ProfaneCommand.java
index 8a7f5767ed1..a389859ef4e 100644
--- a/Mage.Sets/src/mage/cards/p/ProfaneCommand.java
+++ b/Mage.Sets/src/mage/cards/p/ProfaneCommand.java
@@ -1,7 +1,6 @@
package mage.cards.p;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.dynamicvalue.DynamicValue;
@@ -26,6 +25,9 @@ import mage.game.Game;
import mage.target.TargetPlayer;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
* @author LevelX2
@@ -64,27 +66,8 @@ public final class ProfaneCommand extends CardImpl {
mode.getEffects().add(effect);
mode.getTargets().add(new TargetCreaturePermanent(0, 1));
this.getSpellAbility().addMode(mode);
- }
- @Override
- public void adjustTargets(Ability ability, Game game) {
- // adjust targets is called for every selected mode
- Mode mode = ability.getModes().getMode();
- for (Effect effect : mode.getEffects()) {
- if (effect instanceof ReturnFromGraveyardToBattlefieldTargetEffect) {
- mode.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- FilterCard filter = new FilterCreatureCard("creature card with converted mana cost " + xValue + " or less from your graveyard");
- filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, xValue + 1));
- mode.getTargets().add(new TargetCardInYourGraveyard(filter));
- }
- if (effect instanceof GainAbilityTargetEffect) {
- mode.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures gain fear until end of turn");
- mode.getTargets().add(new TargetCreaturePermanent(0, xValue, filter, false));
- }
- }
+ this.getSpellAbility().setTargetAdjuster(ProfaneCommandAdjuster.instance);
}
public ProfaneCommand(final ProfaneCommand card) {
@@ -96,3 +79,27 @@ public final class ProfaneCommand extends CardImpl {
return new ProfaneCommand(this);
}
}
+
+enum ProfaneCommandAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ // adjust targets is called for every selected mode
+ Mode mode = ability.getModes().getMode();
+ int xValue = ability.getManaCostsToPay().getX();
+ for (Effect effect : mode.getEffects()) {
+ if (effect instanceof ReturnFromGraveyardToBattlefieldTargetEffect) {
+ mode.getTargets().clear();
+ FilterCard filter = new FilterCreatureCard("creature card with converted mana cost " + xValue + " or less from your graveyard");
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, xValue + 1));
+ mode.getTargets().add(new TargetCardInYourGraveyard(filter));
+ }
+ if (effect instanceof GainAbilityTargetEffect) {
+ mode.getTargets().clear();
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures gain fear until end of turn");
+ mode.getTargets().add(new TargetCreaturePermanent(0, xValue, filter, false));
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/q/QuarantineField.java b/Mage.Sets/src/mage/cards/q/QuarantineField.java
index ee87bc53b4e..591e3c8d549 100644
--- a/Mage.Sets/src/mage/cards/q/QuarantineField.java
+++ b/Mage.Sets/src/mage/cards/q/QuarantineField.java
@@ -1,7 +1,6 @@
package mage.cards.q;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@@ -21,10 +20,12 @@ import mage.filter.predicate.permanent.ControllerPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.util.CardUtil;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class QuarantineField extends CardImpl {
@@ -35,42 +36,43 @@ public final class QuarantineField extends CardImpl {
// Quarantine Field enters the battlefield with X isolation counters on it.
this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.ISOLATION.createInstance())));
- // When Quarantine Field enters the battlefield, for each isolation counter on it, exile up to one target nonland permanent an opponenet controls until Quarantine Field leaves the battlefield.
+ // When Quarantine Field enters the battlefield, for each isolation counter on it, exile up to one target nonland permanent an opponent controls until Quarantine Field leaves the battlefield.
Ability ability = new EntersBattlefieldTriggeredAbility(new QuarantineFieldEffect(), false);
ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility()));
+ ability.setTargetAdjuster(QuarantineFieldAdjuster.instance);
this.addAbility(ability);
-
}
public QuarantineField(final QuarantineField card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof EntersBattlefieldTriggeredAbility) {
- Permanent sourceObject = game.getPermanent(ability.getSourceId());
- if (sourceObject != null) {
- int isolationCounters = sourceObject.getCounters(game).getCount(CounterType.ISOLATION);
- FilterNonlandPermanent filter = new FilterNonlandPermanent("up to " + isolationCounters + " nonland permanents controlled by any opponents");
- filter.add(new ControllerPredicate(TargetController.OPPONENT));
- ability.addTarget(new TargetPermanent(0, isolationCounters, filter, false));
- }
-
- }
- }
-
@Override
public QuarantineField copy() {
return new QuarantineField(this);
}
}
+enum QuarantineFieldAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Permanent sourceObject = game.getPermanent(ability.getSourceId());
+ if (sourceObject != null) {
+ int isolationCounters = sourceObject.getCounters(game).getCount(CounterType.ISOLATION);
+ FilterNonlandPermanent filter = new FilterNonlandPermanent("up to " + isolationCounters + " nonland permanents controlled by an opponent");
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ ability.addTarget(new TargetPermanent(0, isolationCounters, filter, false));
+ }
+ }
+}
+
class QuarantineFieldEffect extends OneShotEffect {
public QuarantineFieldEffect() {
super(Outcome.Exile);
- this.staticText = "for each isolation counter on it, exile up to one target nonland permanent an opponenet controls until {this} leaves the battlefield";
+ this.staticText = "for each isolation counter on it, exile up to one target nonland permanent an opponent controls until {this} leaves the battlefield";
}
public QuarantineFieldEffect(final QuarantineFieldEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/r/Reap.java b/Mage.Sets/src/mage/cards/r/Reap.java
index 36d4d1baf6a..f3db1b97ecd 100644
--- a/Mage.Sets/src/mage/cards/r/Reap.java
+++ b/Mage.Sets/src/mage/cards/r/Reap.java
@@ -1,63 +1,40 @@
package mage.cards.r;
-import java.util.UUID;
import mage.ObjectColor;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
-import mage.game.Game;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.filter.predicate.mageobject.ColorPredicate;
+import mage.game.Game;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetOpponent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author L_J
*/
public final class Reap extends CardImpl {
-
- private static final FilterPermanent filter = new FilterPermanent("black permanents");
-
- static {
- filter.add(new ColorPredicate(ObjectColor.BLACK));
- }
public Reap(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}");
// Return up to X target cards from your graveyard to your hand, where X is the number of black permanents target opponent controls as you cast Reap.
this.getSpellAbility().addEffect(new ReturnToHandTargetEffect().setText("Return up to X target cards from your graveyard to your hand, where X is the number of black permanents target opponent controls as you cast Reap."));
this.getSpellAbility().addTarget(new TargetOpponent());
- this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 0, new FilterCard("cards from your graveyard")));
+ this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 0));
+ this.getSpellAbility().setTargetAdjuster(ReapAdjuster.instance);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- Player controller = game.getPlayer(ability.getControllerId());
- if (controller != null) {
- ability.getTargets().clear();
- UUID opponentId = null;
- Target target = new TargetOpponent();
- if (controller.chooseTarget(Outcome.ReturnToHand, target, ability, game)) {
- opponentId = target.getFirstTarget();
- }
- int numbTargets = game.getBattlefield().getAllActivePermanents(filter, opponentId, game).size();
- ability.addTarget(new TargetCardInYourGraveyard(0, numbTargets, new FilterCard("card" + (numbTargets == 1 ? "" : "s") + " from your graveyard")));
- }
- }
- }
-
-
public Reap(final Reap card) {
super(card);
}
@@ -67,3 +44,27 @@ public final class Reap extends CardImpl {
return new Reap(this);
}
}
+
+enum ReapAdjuster implements TargetAdjuster {
+ instance;
+ private static final FilterPermanent filter = new FilterPermanent("black permanents");
+
+ static {
+ filter.add(new ColorPredicate(ObjectColor.BLACK));
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Player controller = game.getPlayer(ability.getControllerId());
+ if (controller != null) {
+ ability.getTargets().clear();
+ UUID opponentId = null;
+ Target target = new TargetOpponent();
+ if (controller.chooseTarget(Outcome.ReturnToHand, target, ability, game)) {
+ opponentId = target.getFirstTarget();
+ }
+ int numbTargets = game.getBattlefield().getAllActivePermanents(filter, opponentId, game).size();
+ ability.addTarget(new TargetCardInYourGraveyard(0, numbTargets, new FilterCard("card" + (numbTargets == 1 ? "" : "s") + " from your graveyard")));
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java b/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java
index d0bc76ed940..a176fbb338e 100644
--- a/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java
+++ b/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java
@@ -1,9 +1,7 @@
package mage.cards.r;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
@@ -13,9 +11,11 @@ import mage.constants.CardType;
import mage.game.Game;
import mage.game.permanent.token.GremlinToken;
import mage.target.common.TargetArtifactPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author Styxo
*/
public final class ReleaseTheGremlins extends CardImpl {
@@ -30,15 +30,7 @@ public final class ReleaseTheGremlins extends CardImpl {
// Create X 2/2 red Gremlin creature tokens.
this.getSpellAbility().addEffect(new CreateTokenEffect(new GremlinToken(), new ManacostVariableValue()));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- ability.addTarget(new TargetArtifactPermanent(xValue, xValue));
- }
+ this.getSpellAbility().setTargetAdjuster(ReleaseTheGremlinsAdjuster.instance);
}
public ReleaseTheGremlins(final ReleaseTheGremlins card) {
@@ -50,3 +42,13 @@ public final class ReleaseTheGremlins extends CardImpl {
return new ReleaseTheGremlins(this);
}
}
+
+enum ReleaseTheGremlinsAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetArtifactPermanent(ability.getManaCostsToPay().getX()));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/r/RestlessDreams.java b/Mage.Sets/src/mage/cards/r/RestlessDreams.java
index 9bc906e22a3..d20f30be5e0 100644
--- a/Mage.Sets/src/mage/cards/r/RestlessDreams.java
+++ b/Mage.Sets/src/mage/cards/r/RestlessDreams.java
@@ -1,23 +1,21 @@
package mage.cards.r;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.costs.common.DiscardXTargetCost;
-import mage.abilities.dynamicvalue.common.GetXValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.game.Game;
-import mage.target.Target;
import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author fireshoes
*/
public final class RestlessDreams extends CardImpl {
@@ -26,7 +24,7 @@ public final class RestlessDreams extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{B}");
// As an additional cost to cast Restless Dreams, discard X cards.
- this.getSpellAbility().addCost(new DiscardXTargetCost(new FilterCard("cards"), true));
+ this.getSpellAbility().addCost(new DiscardXTargetCost(StaticFilters.FILTER_CARD_CARDS, true));
// Return X target creature cards from your graveyard to your hand.
Effect effect = new ReturnFromGraveyardToHandTargetEffect();
effect.setText("Return X target creature cards from your graveyard to your hand");
@@ -37,15 +35,21 @@ public final class RestlessDreams extends CardImpl {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- int xValue = new GetXValue().calculate(game, ability, null);
- Target target = new TargetCardInYourGraveyard(xValue, StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD);
- ability.addTarget(target);
- }
-
@Override
public RestlessDreams copy() {
return new RestlessDreams(this);
}
}
+
+enum RestlessDreamsAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCardInYourGraveyard(
+ ability.getManaCostsToPay().getX(),
+ StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD
+ ));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/r/ReturnToDust.java b/Mage.Sets/src/mage/cards/r/ReturnToDust.java
index c57d35ac043..2e25ab591f6 100644
--- a/Mage.Sets/src/mage/cards/r/ReturnToDust.java
+++ b/Mage.Sets/src/mage/cards/r/ReturnToDust.java
@@ -2,52 +2,87 @@
package mage.cards.r;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.Effect;
-import mage.abilities.effects.common.ExileTargetEffect;
+import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
- *
* @author emerald000
*/
public final class ReturnToDust extends CardImpl {
public ReturnToDust(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{W}{W}");
-
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}{W}");
// Exile target artifact or enchantment. If you cast this spell during your main phase, you may exile up to one other target artifact or enchantment.
- Effect effect = new ExileTargetEffect();
- effect.setText("Exile target artifact or enchantment. If you cast this spell during your main phase, you may exile up to one other target artifact or enchantment");
- this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addEffect(new ReturnToDustEffect());
+ this.getSpellAbility().addTarget(new TargetPermanent(1, 2, StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT, false));
}
public ReturnToDust(final ReturnToDust card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- if (game.isActivePlayer(ability.getControllerId()) && game.isMainPhase()) {
- ability.addTarget(new TargetPermanent(1, 2, StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT, false));
- }
- else {
- ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT));
- }
- }
- }
-
@Override
public ReturnToDust copy() {
return new ReturnToDust(this);
}
}
+
+class ReturnToDustEffect extends OneShotEffect {
+
+ ReturnToDustEffect() {
+ super(Outcome.DestroyPermanent);
+ staticText = "Exile target artifact or enchantment. If you cast this spell during your main phase, you may exile up to one other target artifact or enchantment";
+ }
+
+ private ReturnToDustEffect(final ReturnToDustEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public Effect copy() {
+ return new ReturnToDustEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ if (player == null) {
+ return false;
+ }
+ int targetsCleared = 0;
+ for (UUID targetId : getTargetPointer().getTargets(game, source)) {
+ Permanent permanent = game.getPermanent(targetId);
+ if (permanent == null) {
+ continue;
+ }
+ if (targetsCleared == 0) {
+ player.moveCards(permanent, Zone.EXILED, source, game);
+ targetsCleared++;
+ } else if (targetsCleared == 1) {
+ if (game.isActivePlayer(source.getControllerId()) && game.isMainPhase()
+ && player.chooseUse(outcome, "Exile another permanent?", source, game)) {
+ player.moveCards(permanent, Zone.EXILED, source, game);
+ targetsCleared++;
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/r/ReturnToTheRanks.java b/Mage.Sets/src/mage/cards/r/ReturnToTheRanks.java
index c0b4ec5645f..326369bf415 100644
--- a/Mage.Sets/src/mage/cards/r/ReturnToTheRanks.java
+++ b/Mage.Sets/src/mage/cards/r/ReturnToTheRanks.java
@@ -1,7 +1,6 @@
package mage.cards.r;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
@@ -14,41 +13,26 @@ import mage.filter.common.FilterCreatureCard;
import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
import mage.game.Game;
import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class ReturnToTheRanks extends CardImpl {
- private static final FilterCreatureCard filter = new FilterCreatureCard("creature cards with converted mana cost 2 or less from your graveyard");
-
- static {
- filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, 3));
- }
-
public ReturnToTheRanks(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{W}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{W}{W}");
// Convoke
this.addAbility(new ConvokeAbility());
+
// Return X target creature cards with converted mana cost 2 or less from your graveyard to the battlefield.
Effect effect = new ReturnFromGraveyardToBattlefieldTargetEffect();
effect.setText("Return X target creature cards with converted mana cost 2 or less from your graveyard to the battlefield");
this.getSpellAbility().addEffect(effect);
- this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0,Integer.MAX_VALUE, filter));
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- for (Effect effect : ability.getEffects()) {
- if (effect instanceof ReturnFromGraveyardToBattlefieldTargetEffect) {
- int xValue = ability.getManaCostsToPay().getX();
- ability.getTargets().clear();
- ability.addTarget(new TargetCardInYourGraveyard(xValue,xValue, filter));
- }
- }
+ this.getSpellAbility().setTargetAdjuster(ReturnToTheRanksAdjuster.instance);
}
public ReturnToTheRanks(final ReturnToTheRanks card) {
@@ -60,3 +44,19 @@ public final class ReturnToTheRanks extends CardImpl {
return new ReturnToTheRanks(this);
}
}
+
+enum ReturnToTheRanksAdjuster implements TargetAdjuster {
+ instance;
+ private static final FilterCreatureCard filter = new FilterCreatureCard("creature cards with converted mana cost 2 or less from your graveyard");
+
+ static {
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, 3));
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ int xValue = ability.getManaCostsToPay().getX();
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCardInYourGraveyard(xValue, xValue, filter));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/r/RushingRiver.java b/Mage.Sets/src/mage/cards/r/RushingRiver.java
index 3f0ac959ed0..b5211042160 100644
--- a/Mage.Sets/src/mage/cards/r/RushingRiver.java
+++ b/Mage.Sets/src/mage/cards/r/RushingRiver.java
@@ -1,9 +1,7 @@
package mage.cards.r;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.condition.common.KickedCondition;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.decorator.ConditionalOneShotEffect;
@@ -17,23 +15,25 @@ import mage.filter.common.FilterControlledLandPermanent;
import mage.game.Game;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetNonlandPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetpointer.SecondTargetPointer;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class RushingRiver extends CardImpl {
public RushingRiver(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}");
// Kicker-Sacrifice a land.
this.addAbility(new KickerAbility(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land")))));
// Return target nonland permanent to its owner's hand. If Rushing River was kicked, return another target nonland permanent to its owner's hand.
- this.getSpellAbility().addEffect(new ReturnToHandTargetEffect());
+ this.getSpellAbility().addEffect(new ReturnToHandTargetEffect());
Effect effect = new ConditionalOneShotEffect(
new ReturnToHandTargetEffect(),
KickedCondition.instance,
@@ -41,16 +41,7 @@ public final class RushingRiver extends CardImpl {
effect.setTargetPointer(new SecondTargetPointer());
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetNonlandPermanent());
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility && KickedCondition.instance.apply(game, ability)) {
- ability.getTargets().clear();
- ability.addTarget(new TargetNonlandPermanent(2));
- }
-
+ this.getSpellAbility().setTargetAdjuster(RushingRiverAdjuster.instance);
}
public RushingRiver(final RushingRiver card) {
@@ -62,3 +53,15 @@ public final class RushingRiver extends CardImpl {
return new RushingRiver(this);
}
}
+
+enum RushingRiverAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ if (KickedCondition.instance.apply(game, ability)) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetNonlandPermanent(2));
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/s/SatyrFiredancer.java b/Mage.Sets/src/mage/cards/s/SatyrFiredancer.java
index fafe9257058..e21da969683 100644
--- a/Mage.Sets/src/mage/cards/s/SatyrFiredancer.java
+++ b/Mage.Sets/src/mage/cards/s/SatyrFiredancer.java
@@ -1,9 +1,6 @@
package mage.cards.s;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
@@ -13,8 +10,8 @@ import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.ControllerIdPredicate;
@@ -25,16 +22,20 @@ import mage.game.permanent.Permanent;
import mage.game.stack.StackObject;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetpointer.FixedTarget;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class SatyrFiredancer extends CardImpl {
public SatyrFiredancer(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT,CardType.CREATURE},"{1}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{1}{R}");
this.subtype.add(SubType.SATYR);
this.power = new MageInt(1);
@@ -47,19 +48,7 @@ public final class SatyrFiredancer extends CardImpl {
public SatyrFiredancer(final SatyrFiredancer card) {
super(card);
}
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SatyrFiredancerTriggeredAbility) {
- Player opponent = game.getPlayer(ability.getEffects().get(0).getTargetPointer().getFirst(game, ability));
- if (opponent != null) {
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creature controlled by " + opponent.getLogName());
- filter.add(new ControllerIdPredicate(opponent.getId()));
- ability.getTargets().add(new TargetCreaturePermanent(filter));
- }
- }
- }
-
+
@Override
public SatyrFiredancer copy() {
return new SatyrFiredancer(this);
@@ -72,6 +61,7 @@ class SatyrFiredancerTriggeredAbility extends TriggeredAbilityImpl {
public SatyrFiredancerTriggeredAbility() {
super(Zone.BATTLEFIELD, new SatyrFiredancerDamageEffect(), false);
+ targetAdjuster = SatyrFiredancerAdjuster.instance;
}
public SatyrFiredancerTriggeredAbility(final SatyrFiredancerTriggeredAbility ability) {
@@ -97,7 +87,7 @@ class SatyrFiredancerTriggeredAbility extends TriggeredAbilityImpl {
public boolean checkTrigger(GameEvent event, Game game) {
if (isControlledBy(game.getControllerId(event.getSourceId()))) {
MageObject damageSource = game.getObject(event.getSourceId());
- if (damageSource != null) {
+ if (damageSource != null) {
if (game.getOpponents(getControllerId()).contains(event.getTargetId())) {
MageObject object = game.getObject(event.getSourceId());
if (object.isInstant() || object.isSorcery()) {
@@ -105,7 +95,7 @@ class SatyrFiredancerTriggeredAbility extends TriggeredAbilityImpl {
if (damageSource instanceof StackObject) {
handledStackObjects.add(damageSource.getId());
}
- for (Effect effect: this.getEffects()) {
+ for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId())); // used by adjust targets
effect.setValue("damage", event.getAmount());
}
@@ -147,10 +137,24 @@ class SatyrFiredancerDamageEffect extends OneShotEffect {
if (targetCreature != null && controller != null) {
int damage = (Integer) this.getValue("damage");
if (damage > 0) {
- targetCreature.damage(damage, source.getSourceId(), game, false, true);
+ targetCreature.damage(damage, source.getSourceId(), game, false, true);
}
return true;
}
return false;
}
}
+
+enum SatyrFiredancerAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Player opponent = game.getPlayer(ability.getEffects().get(0).getTargetPointer().getFirst(game, ability));
+ if (opponent != null) {
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creature controlled by " + opponent.getLogName());
+ filter.add(new ControllerIdPredicate(opponent.getId()));
+ ability.getTargets().add(new TargetCreaturePermanent(filter));
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/s/SentinelOfTheEternalWatch.java b/Mage.Sets/src/mage/cards/s/SentinelOfTheEternalWatch.java
index 04acffd490a..e3f64e774f0 100644
--- a/Mage.Sets/src/mage/cards/s/SentinelOfTheEternalWatch.java
+++ b/Mage.Sets/src/mage/cards/s/SentinelOfTheEternalWatch.java
@@ -1,11 +1,9 @@
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfCombatTriggeredAbility;
-import mage.abilities.effects.Effect;
import mage.abilities.effects.common.TapTargetEffect;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
@@ -14,24 +12,26 @@ import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.constants.Zone;
+import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.permanent.ControllerIdPredicate;
-import mage.game.Game;
-import mage.players.Player;
-import mage.target.Target;
-import mage.target.common.TargetCreaturePermanent;
-import mage.target.targetpointer.FirstTargetPointer;
+import mage.filter.predicate.permanent.ControllerIsActivePlayerPredicate;
+import mage.target.TargetPermanent;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class SentinelOfTheEternalWatch extends CardImpl {
- private final UUID originalId;
+ private static final FilterPermanent filter = new FilterCreaturePermanent("creature controlled by the active player");
+
+ static {
+ filter.add(new ControllerIsActivePlayerPredicate());
+ }
public SentinelOfTheEternalWatch(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{W}");
this.subtype.add(SubType.GIANT);
this.subtype.add(SubType.SOLDIER);
this.power = new MageInt(4);
@@ -39,38 +39,22 @@ public final class SentinelOfTheEternalWatch extends CardImpl {
// Vigilance
this.addAbility(VigilanceAbility.getInstance());
- // At the beginning of combat on each opponent's turn, tap target creature that player controls.
- Ability ability = new BeginningOfCombatTriggeredAbility(Zone.BATTLEFIELD, new TapTargetEffect("target creature that player controls"), TargetController.OPPONENT, false, true);
- originalId = ability.getOriginalId();
- this.addAbility(ability);
+ // At the beginning of combat on each opponent's turn, tap target creature that player controls.
+ Ability ability = new BeginningOfCombatTriggeredAbility(
+ Zone.BATTLEFIELD, new TapTargetEffect("target creature that player controls"),
+ TargetController.OPPONENT, false, false
+ );
+ ability.addTarget(new TargetPermanent(filter));
+ this.addAbility(ability);
}
public SentinelOfTheEternalWatch(final SentinelOfTheEternalWatch card) {
super(card);
- this.originalId = card.originalId;
}
@Override
public SentinelOfTheEternalWatch copy() {
return new SentinelOfTheEternalWatch(this);
}
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- for (Effect effect : ability.getEffects()) {
- UUID opponentId = effect.getTargetPointer().getFirst(game, ability);
- Player opponent = game.getPlayer(opponentId);
- if (opponent != null) {
- effect.setTargetPointer(new FirstTargetPointer());
- FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature from the active opponent");
- filter.add(new ControllerIdPredicate(opponentId));
- Target target = new TargetCreaturePermanent(filter);
- ability.addTarget(target);
- }
- }
- }
- }
-
-}
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/s/SepulchralPrimordial.java b/Mage.Sets/src/mage/cards/s/SepulchralPrimordial.java
index b0073013b91..614a0252bc8 100644
--- a/Mage.Sets/src/mage/cards/s/SepulchralPrimordial.java
+++ b/Mage.Sets/src/mage/cards/s/SepulchralPrimordial.java
@@ -1,9 +1,6 @@
package mage.cards.s;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@@ -13,8 +10,8 @@ import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.common.FilterCreatureCard;
@@ -23,9 +20,13 @@ import mage.game.Game;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCardInOpponentsGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class SepulchralPrimordial extends CardImpl {
@@ -37,28 +38,14 @@ public final class SepulchralPrimordial extends CardImpl {
this.power = new MageInt(5);
this.toughness = new MageInt(4);
- //Vigilance
+ // Intimidate
this.addAbility(IntimidateAbility.getInstance());
// When Sepulchral Primordial enters the battlefield, for each opponent, you may put up to one
// target creature card from that player's graveyard onto the battlefield under your control.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new SepulchralPrimordialEffect(), false));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof EntersBattlefieldTriggeredAbility) {
- ability.getTargets().clear();
- for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
- Player opponent = game.getPlayer(opponentId);
- if (opponent != null) {
- FilterCard filter = new FilterCreatureCard("creature card from " + opponent.getName() + "'s graveyard");
- filter.add(new OwnerIdPredicate(opponentId));
- TargetCardInOpponentsGraveyard target = new TargetCardInOpponentsGraveyard(0, 1, filter);
- ability.addTarget(target);
- }
- }
- }
+ Ability ability = new EntersBattlefieldTriggeredAbility(new SepulchralPrimordialEffect(), false);
+ ability.setTargetAdjuster(SepulchralPrimordialAdjuster.instance);
+ this.addAbility(ability);
}
public SepulchralPrimordial(final SepulchralPrimordial card) {
@@ -71,6 +58,24 @@ public final class SepulchralPrimordial extends CardImpl {
}
}
+enum SepulchralPrimordialAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
+ Player opponent = game.getPlayer(opponentId);
+ if (opponent != null) {
+ FilterCard filter = new FilterCreatureCard("creature card from " + opponent.getName() + "'s graveyard");
+ filter.add(new OwnerIdPredicate(opponentId));
+ TargetCardInOpponentsGraveyard target = new TargetCardInOpponentsGraveyard(0, 1, filter);
+ ability.addTarget(target);
+ }
+ }
+ }
+}
+
class SepulchralPrimordialEffect extends OneShotEffect {
public SepulchralPrimordialEffect() {
diff --git a/Mage.Sets/src/mage/cards/s/ShatteredCrypt.java b/Mage.Sets/src/mage/cards/s/ShatteredCrypt.java
index a2c22cc7bfd..90425abc247 100644
--- a/Mage.Sets/src/mage/cards/s/ShatteredCrypt.java
+++ b/Mage.Sets/src/mage/cards/s/ShatteredCrypt.java
@@ -1,9 +1,7 @@
package mage.cards.s;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
@@ -15,9 +13,11 @@ import mage.filter.common.FilterCreatureCard;
import mage.game.Game;
import mage.target.Target;
import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class ShatteredCrypt extends CardImpl {
@@ -30,17 +30,7 @@ public final class ShatteredCrypt extends CardImpl {
effect.setText("Return X target creature cards from your graveyard to your hand");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(new ManacostVariableValue()));
- this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(1, new FilterCreatureCard()));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- Target target = new TargetCardInYourGraveyard(xValue, new FilterCreatureCard(new StringBuilder(xValue).append(xValue != 1 ? " creature cards" : "creature card").append(" from your graveyard").toString()));
- ability.addTarget(target);
- }
+ this.getSpellAbility().setTargetAdjuster(ShatteredCryptAdjuster.instance);
}
public ShatteredCrypt(final ShatteredCrypt card) {
@@ -52,3 +42,15 @@ public final class ShatteredCrypt extends CardImpl {
return new ShatteredCrypt(this);
}
}
+
+enum ShatteredCryptAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ Target target = new TargetCardInYourGraveyard(xValue, new FilterCreatureCard((xValue != 1 ? " creature cards" : "creature card") + " from your graveyard"));
+ ability.addTarget(target);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/s/SpellBlast.java b/Mage.Sets/src/mage/cards/s/SpellBlast.java
index 36a131fdb2c..85337f0ce54 100644
--- a/Mage.Sets/src/mage/cards/s/SpellBlast.java
+++ b/Mage.Sets/src/mage/cards/s/SpellBlast.java
@@ -1,9 +1,7 @@
package mage.cards.s;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.common.CounterTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -12,24 +10,22 @@ import mage.constants.ComparisonType;
import mage.filter.FilterSpell;
import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
import mage.game.Game;
-import mage.target.Target;
import mage.target.TargetSpell;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class SpellBlast extends CardImpl {
- private static final FilterSpell filter = new FilterSpell("spell with converted mana cost X");
-
public SpellBlast(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{U}");
-
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}");
// Counter target spell with converted mana cost X.
- this.getSpellAbility().addEffect(new CounterTargetEffect());
- this.getSpellAbility().addTarget(new TargetSpell(filter));
+ this.getSpellAbility().addEffect(new CounterTargetEffect().setText("counter target spell with converted mana cost X"));
+ this.getSpellAbility().setTargetAdjuster(SpellBlastAdjuster.instance);
}
public SpellBlast(final SpellBlast card) {
@@ -40,17 +36,17 @@ public final class SpellBlast extends CardImpl {
public SpellBlast copy() {
return new SpellBlast(this);
}
+}
+
+enum SpellBlastAdjuster implements TargetAdjuster {
+ instance;
@Override
public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- int xValue = ability.getManaCostsToPay().getX();
- ability.getTargets().clear();
- FilterSpell newfilter = new FilterSpell(new StringBuilder("spell with converted mana cost ").append(xValue).toString());
- newfilter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue));
- Target target = new TargetSpell(newfilter);
- ability.addTarget(target);
- }
-
+ int xValue = ability.getManaCostsToPay().getX();
+ ability.getTargets().clear();
+ FilterSpell filter = new FilterSpell("spell with converted mana cost " + xValue);
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue));
+ ability.addTarget(new TargetSpell(filter));
}
-}
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/s/SpellBurst.java b/Mage.Sets/src/mage/cards/s/SpellBurst.java
index 35d8c2a6cce..7c2cae1ae74 100644
--- a/Mage.Sets/src/mage/cards/s/SpellBurst.java
+++ b/Mage.Sets/src/mage/cards/s/SpellBurst.java
@@ -1,9 +1,7 @@
package mage.cards.s;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.common.CounterTargetEffect;
import mage.abilities.keyword.BuybackAbility;
import mage.cards.CardImpl;
@@ -14,6 +12,9 @@ import mage.filter.FilterSpell;
import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
import mage.game.Game;
import mage.target.TargetSpell;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
* @author LevelX2
@@ -23,23 +24,12 @@ public final class SpellBurst extends CardImpl {
public SpellBurst(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}");
-
// Buyback {3}
this.addAbility(new BuybackAbility("{3}"));
// Counter target spell with converted mana cost X.
- this.getSpellAbility().addEffect(new CounterTargetEffect());
- this.getSpellAbility().addTarget(new TargetSpell(new FilterSpell("spell with converted mana cost X")));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- FilterSpell filter = new FilterSpell("spell with converted mana cost X");
- filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, ability.getManaCostsToPay().getX()));
- ability.addTarget(new TargetSpell(filter));
- }
+ this.getSpellAbility().addEffect(new CounterTargetEffect().setText("counter target spell with converted mana cost X"));
+ this.getSpellAbility().setTargetAdjuster(SpellBurstAdjuster.instance);
}
public SpellBurst(final SpellBurst card) {
@@ -51,3 +41,16 @@ public final class SpellBurst extends CardImpl {
return new SpellBurst(this);
}
}
+
+enum SpellBurstAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ int xValue = ability.getManaCostsToPay().getX();
+ ability.getTargets().clear();
+ FilterSpell filter = new FilterSpell("spell with converted mana cost " + xValue);
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue));
+ ability.addTarget(new TargetSpell(filter));
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/s/SpellstutterSprite.java b/Mage.Sets/src/mage/cards/s/SpellstutterSprite.java
index 2bfc12b77dd..1126c9bcbc0 100644
--- a/Mage.Sets/src/mage/cards/s/SpellstutterSprite.java
+++ b/Mage.Sets/src/mage/cards/s/SpellstutterSprite.java
@@ -1,40 +1,40 @@
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
+import mage.MageObject;
import mage.abilities.Ability;
-import mage.abilities.Mode;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CounterTargetEffect;
import mage.abilities.keyword.FlashAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.FilterSpell;
-import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.filter.predicate.ObjectSourcePlayer;
+import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.filter.predicate.mageobject.SubtypePredicate;
-import mage.filter.predicate.permanent.ControllerPredicate;
import mage.game.Game;
-import mage.game.stack.StackObject;
import mage.target.TargetSpell;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class SpellstutterSprite extends CardImpl {
-
- static final FilterPermanent filter = new FilterPermanent("number of Faeries you control");
+
+ private static final FilterSpell filter = new FilterSpell("spell with converted mana cost X or less, where X is the number of Faeries you control");
+
static {
- filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new SubtypePredicate(SubType.FAERIE));
+ filter.add(SpellstutterSpritePredicate.instance);
}
public SpellstutterSprite(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
this.subtype.add(SubType.FAERIE);
this.subtype.add(SubType.WIZARD);
@@ -43,71 +43,37 @@ public final class SpellstutterSprite extends CardImpl {
// Flash
this.addAbility(FlashAbility.getInstance());
+
// Flying
this.addAbility(FlyingAbility.getInstance());
+
// When Spellstutter Sprite enters the battlefield, counter target spell with converted mana cost X or less, where X is the number of Faeries you control.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new SpellstutterSpriteCounterTargetEffect()));
+ Ability ability = new EntersBattlefieldTriggeredAbility(new CounterTargetEffect());
+ ability.addTarget(new TargetSpell(filter));
+ this.addAbility(ability);
}
public SpellstutterSprite(final SpellstutterSprite card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof EntersBattlefieldTriggeredAbility) {
- int numberFaeries = game.getState().getBattlefield().countAll(filter, ability.getControllerId(), game);
- FilterSpell xFilter = new FilterSpell(new StringBuilder("spell with converted mana cost ").append(numberFaeries).append(" or less").toString());
- xFilter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, numberFaeries + 1));
- ability.getTargets().clear();
- ability.addTarget(new TargetSpell(xFilter));
- }
- }
-
@Override
public SpellstutterSprite copy() {
return new SpellstutterSprite(this);
}
}
-class SpellstutterSpriteCounterTargetEffect extends OneShotEffect {
+enum SpellstutterSpritePredicate implements ObjectSourcePlayerPredicate
")
);
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ this.getSpellAbility().setTargetAdjuster(TheCrowdGoesWildAdjuster.instance);
// Each creature with a +1/+1 counter on it gains trample until end of turn.
this.getSpellAbility().addEffect(new GainAbilityAllEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, filter));
@@ -50,17 +51,18 @@ public final class TheCrowdGoesWild extends CardImpl {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- ability.addTarget(new TargetCreaturePermanent(0, xValue));
- }
- }
-
@Override
public TheCrowdGoesWild copy() {
return new TheCrowdGoesWild(this);
}
}
+
+enum TheCrowdGoesWildAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCreaturePermanent(0, ability.getManaCostsToPay().getX()));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/t/Thrive.java b/Mage.Sets/src/mage/cards/t/Thrive.java
index 0ef155b6a8f..d4d640ab233 100644
--- a/Mage.Sets/src/mage/cards/t/Thrive.java
+++ b/Mage.Sets/src/mage/cards/t/Thrive.java
@@ -1,9 +1,7 @@
package mage.cards.t;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.cards.CardImpl;
@@ -12,21 +10,23 @@ import mage.constants.CardType;
import mage.counters.CounterType;
import mage.game.Game;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author emerald000
*/
public final class Thrive extends CardImpl {
public Thrive(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{G}");
// Put a +1/+1 counter on each of X target creatures.
Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance());
effect.setText("Put a +1/+1 counter on each of X target creatures");
this.getSpellAbility().addEffect(effect);
- this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1));
+ this.getSpellAbility().setTargetAdjuster(ThriveAdjuster.instance);
}
public Thrive(final Thrive card) {
@@ -37,13 +37,14 @@ public final class Thrive extends CardImpl {
public Thrive copy() {
return new Thrive(this);
}
-
+}
+
+enum ThriveAdjuster implements TargetAdjuster {
+ instance;
+
@Override
public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- ability.addTarget(new TargetCreaturePermanent(xValue));
- }
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX()));
}
-}
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/t/TurbulentDreams.java b/Mage.Sets/src/mage/cards/t/TurbulentDreams.java
index cd595d460ef..6dcdd74d69b 100644
--- a/Mage.Sets/src/mage/cards/t/TurbulentDreams.java
+++ b/Mage.Sets/src/mage/cards/t/TurbulentDreams.java
@@ -1,60 +1,58 @@
package mage.cards.t;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.costs.common.DiscardXTargetCost;
-import mage.abilities.dynamicvalue.common.GetXValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
-import mage.filter.predicate.Predicates;
-import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.filter.StaticFilters;
+import mage.filter.common.FilterNonlandPermanent;
import mage.game.Game;
import mage.target.Target;
import mage.target.TargetPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author fireshoes
*/
public final class TurbulentDreams extends CardImpl {
-
- private static final FilterPermanent filter = new FilterPermanent("nonland permanents");
-
- static {
- filter.add(Predicates.not(new CardTypePredicate(CardType.LAND)));
- }
public TurbulentDreams(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{U}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{U}{U}");
// As an additional cost to cast Turbulent Dreams, discard X cards.
- this.getSpellAbility().addCost(new DiscardXTargetCost(new FilterCard("cards"), true));
-
+ this.getSpellAbility().addCost(new DiscardXTargetCost(StaticFilters.FILTER_CARD_CARDS, true));
+
// Return X target nonland permanents to their owners' hands.
Effect effect = new ReturnToHandTargetEffect();
effect.setText("Return X target nonland permanents to their owners' hands");
this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().setTargetAdjuster(TurbulentDreamsAdjuster.instance);
}
public TurbulentDreams(final TurbulentDreams card) {
super(card);
}
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- int xValue = new GetXValue().calculate(game, ability, null);
- Target target = new TargetPermanent(0, xValue, filter, false);
- ability.addTarget(target);
- }
@Override
public TurbulentDreams copy() {
return new TurbulentDreams(this);
}
}
+
+enum TurbulentDreamsAdjuster implements TargetAdjuster {
+ instance;
+ private static final FilterPermanent filter = new FilterNonlandPermanent("nonland permanents");
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Target target = new TargetPermanent(0, ability.getManaCostsToPay().getX(), filter, false);
+ ability.addTarget(target);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/u/UnstableFooting.java b/Mage.Sets/src/mage/cards/u/UnstableFooting.java
index 3682d933e10..898570d5a5f 100644
--- a/Mage.Sets/src/mage/cards/u/UnstableFooting.java
+++ b/Mage.Sets/src/mage/cards/u/UnstableFooting.java
@@ -1,9 +1,7 @@
package mage.cards.u;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.condition.common.KickedCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.ReplacementEffectImpl;
@@ -18,9 +16,11 @@ import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.target.common.TargetPlayerOrPlaneswalker;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class UnstableFooting extends CardImpl {
@@ -36,20 +36,12 @@ public final class UnstableFooting extends CardImpl {
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
new DamageTargetEffect(5),
KickedCondition.instance,
- "If this spell was kicked, it deals 5 damage to target player or planeswalker"));
+ "If this spell was kicked, it deals 5 damage to target player or planeswalker")
+ );
+ this.getSpellAbility().setTargetAdjuster(UnstableFootingAdjuster.instance);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- if (KickedCondition.instance.apply(game, ability)) {
- ability.addTarget(new TargetPlayerOrPlaneswalker());
- }
- }
- }
-
public UnstableFooting(final UnstableFooting card) {
super(card);
}
@@ -60,6 +52,18 @@ public final class UnstableFooting extends CardImpl {
}
}
+enum UnstableFootingAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ if (KickedCondition.instance.apply(game, ability)) {
+ ability.addTarget(new TargetPlayerOrPlaneswalker());
+ }
+ }
+}
+
class UnstableFootingEffect extends ReplacementEffectImpl {
public UnstableFootingEffect() {
diff --git a/Mage.Sets/src/mage/cards/v/VengefulDreams.java b/Mage.Sets/src/mage/cards/v/VengefulDreams.java
index 93f6a614520..55b4b8520df 100644
--- a/Mage.Sets/src/mage/cards/v/VengefulDreams.java
+++ b/Mage.Sets/src/mage/cards/v/VengefulDreams.java
@@ -1,52 +1,58 @@
package mage.cards.v;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.costs.common.DiscardXTargetCost;
-import mage.abilities.dynamicvalue.common.GetXValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.ExileTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.FilterCard;
+import mage.filter.FilterPermanent;
import mage.filter.common.FilterAttackingCreature;
import mage.game.Game;
import mage.target.Target;
-import mage.target.common.TargetCreaturePermanent;
+import mage.target.TargetPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author fireshoes
*/
public final class VengefulDreams extends CardImpl {
public VengefulDreams(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{W}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{W}{W}");
// As an additional cost to cast Vengeful Dreams, discard X cards.
this.getSpellAbility().addCost(new DiscardXTargetCost(new FilterCard("cards"), true));
-
+
// Exile X target attacking creatures.
Effect effect = new ExileTargetEffect();
effect.setText("Exile X target attacking creatures");
this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().setTargetAdjuster(VengefulDreamsAdjuster.instance);
}
public VengefulDreams(final VengefulDreams card) {
super(card);
}
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- int xValue = new GetXValue().calculate(game, ability, null);
- Target target = new TargetCreaturePermanent(0, xValue, new FilterAttackingCreature(), false);
- ability.addTarget(target);
- }
@Override
public VengefulDreams copy() {
return new VengefulDreams(this);
}
}
+
+enum VengefulDreamsAdjuster implements TargetAdjuster {
+ instance;
+ private static final FilterPermanent filter = new FilterAttackingCreature();
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Target target = new TargetPermanent(0, ability.getManaCostsToPay().getX(), filter, false);
+ ability.addTarget(target);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/v/VizierOfDeferment.java b/Mage.Sets/src/mage/cards/v/VizierOfDeferment.java
index 227ecc40a84..6e24c93d234 100644
--- a/Mage.Sets/src/mage/cards/v/VizierOfDeferment.java
+++ b/Mage.Sets/src/mage/cards/v/VizierOfDeferment.java
@@ -1,11 +1,7 @@
package mage.cards.v;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
import mage.MageInt;
-import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
@@ -16,12 +12,9 @@ import mage.abilities.keyword.FlashAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.constants.Zone;
-import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.Predicates;
-import mage.filter.predicate.permanent.PermanentIdPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
@@ -30,8 +23,9 @@ import mage.target.targetpointer.FixedTarget;
import mage.watchers.common.AttackedThisTurnWatcher;
import mage.watchers.common.BlockedThisTurnWatcher;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class VizierOfDeferment extends CardImpl {
@@ -49,39 +43,10 @@ public final class VizierOfDeferment extends CardImpl {
// When Vizier of Deferment enters the battlefield, you may exile target creature if it attacked or blocked this turn. Return that card to the battlefield under its owner's control at the beginning of the next end step.
Ability ability = new EntersBattlefieldTriggeredAbility(new VizierOfDefermentEffect(), true);
+ ability.addTarget(new TargetCreaturePermanent());
ability.addWatcher(new AttackedThisTurnWatcher());
ability.addWatcher(new BlockedThisTurnWatcher());
this.addAbility(ability);
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof EntersBattlefieldTriggeredAbility) {
- List