diff --git a/Mage.Sets/src/mage/cards/a/AetherBurst.java b/Mage.Sets/src/mage/cards/a/AetherBurst.java index 6df56ddc58c..a64753a12cd 100644 --- a/Mage.Sets/src/mage/cards/a/AetherBurst.java +++ b/Mage.Sets/src/mage/cards/a/AetherBurst.java @@ -1,20 +1,16 @@ package mage.cards.a; -import mage.abilities.Ability; -import mage.abilities.Mode; +import mage.abilities.dynamicvalue.IntPlusDynamicValue; +import mage.abilities.dynamicvalue.common.CardsInAllGraveyardsCount; 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.StaticFilters; import mage.filter.predicate.mageobject.NamePredicate; -import mage.game.Game; -import mage.players.Player; -import mage.target.Target; -import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -22,13 +18,18 @@ import java.util.UUID; * @author magenoxx_at_gmail.com */ public final class AetherBurst extends CardImpl { + private static final FilterCard filter = new FilterCard("cards named Aether Burst"); + static { + filter.add(new NamePredicate("Aether Burst")); + } + public AetherBurst(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}"); // Return up to X target creatures to their owners' hands, where X is one plus the number of cards named Aether Burst in all graveyards as you cast this spell. this.getSpellAbility().addEffect(new ReturnToHandTargetEffect().setText("Return up to X target creatures to their owners' hands, where X is one plus the number of cards named Aether Burst in all graveyards as you cast this spell")); - this.getSpellAbility().addTarget(new DynamicTargetCreaturePermanent()); - this.getSpellAbility().setTargetAdjuster(AetherBurstAdjuster.instance); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1)); + this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(new IntPlusDynamicValue(1, new CardsInAllGraveyardsCount(filter)))); } @@ -41,52 +42,3 @@ public final class AetherBurst extends CardImpl { return new AetherBurst(this); } } - -enum AetherBurstAdjuster implements TargetAdjuster { - instance; - private static final FilterCard filter = new FilterCard("cards named Aether Burst"); - - static { - filter.add(new NamePredicate("Aether Burst")); - } - - @Override - public void adjustTargets(Ability ability, Game game) { - Target target = ability.getTargets().get(0); - if (target instanceof DynamicTargetCreaturePermanent) { - Player controller = game.getPlayer(ability.getControllerId()); - int amount = 0; - if (controller != null) { - for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { - Player player = game.getPlayer(playerId); - if (player != null) { - amount += player.getGraveyard().getCards(filter, game).size(); - } - } - } - target.setMaxNumberOfTargets(amount + 1); - } - } -} - -class DynamicTargetCreaturePermanent extends TargetPermanent { - - public DynamicTargetCreaturePermanent() { - super(StaticFilters.FILTER_PERMANENT_CREATURES); - } - - private DynamicTargetCreaturePermanent(final DynamicTargetCreaturePermanent target) { - super(target); - } - - @Override - public void setMaxNumberOfTargets(int maxNumberOfTargets) { - this.maxNumberOfTargets = maxNumberOfTargets; - } - - @Override - public DynamicTargetCreaturePermanent copy() { - return new DynamicTargetCreaturePermanent(this); - } - -} diff --git a/Mage.Sets/src/mage/cards/a/AetherTide.java b/Mage.Sets/src/mage/cards/a/AetherTide.java index b8a9bba5285..eefc692a975 100644 --- a/Mage.Sets/src/mage/cards/a/AetherTide.java +++ b/Mage.Sets/src/mage/cards/a/AetherTide.java @@ -1,6 +1,5 @@ package mage.cards.a; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.CostAdjuster; @@ -16,7 +15,9 @@ import mage.filter.StaticFilters; import mage.game.Game; import mage.target.common.TargetCardInHand; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.XTargetsAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; + +import java.util.UUID; /** * @@ -37,7 +38,7 @@ public final class AetherTide extends CardImpl { effect.setText("Return X target creatures to their owners' hands"); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().setTargetAdjuster(XTargetsAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); this.getSpellAbility().setCostAdjuster(AetherTideCostAdjuster.instance); } diff --git a/Mage.Sets/src/mage/cards/a/AgilityBobblehead.java b/Mage.Sets/src/mage/cards/a/AgilityBobblehead.java index 9aceca812bc..83578a7a47f 100644 --- a/Mage.Sets/src/mage/cards/a/AgilityBobblehead.java +++ b/Mage.Sets/src/mage/cards/a/AgilityBobblehead.java @@ -21,9 +21,8 @@ import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.AbilityPredicate; -import mage.game.Game; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -61,7 +60,7 @@ public final class AgilityBobblehead extends CardImpl { .setText("and can't be blocked this turn except by creatures with haste, " + "where X is the number of Bobbleheads you control as you activate this ability")); ability.addTarget(new TargetControlledCreaturePermanent(0, 0)); - ability.setTargetAdjuster(new AgilityBobbleheadAdjuster(xValue)); + ability.setTargetAdjuster(new TargetsCountAdjuster(xValue)); ability.addHint(hint); this.addAbility(ability); } @@ -75,21 +74,3 @@ public final class AgilityBobblehead extends CardImpl { return new AgilityBobblehead(this); } } - -// TODO: cleanup after #12107 -class AgilityBobbleheadAdjuster implements TargetAdjuster { - private final DynamicValue dynamicValue; - - AgilityBobbleheadAdjuster(DynamicValue value) { - this.dynamicValue = value; - } - - @Override - public void adjustTargets(Ability ability, Game game) { - int count = dynamicValue.calculate(game, ability, null); - ability.getTargets().clear(); - if (count > 0) { - ability.addTarget(new TargetControlledCreaturePermanent(0, count)); - } - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/a/AlexiZephyrMage.java b/Mage.Sets/src/mage/cards/a/AlexiZephyrMage.java index fa550d37bee..af88f8f5a81 100644 --- a/Mage.Sets/src/mage/cards/a/AlexiZephyrMage.java +++ b/Mage.Sets/src/mage/cards/a/AlexiZephyrMage.java @@ -1,6 +1,5 @@ package mage.cards.a; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -15,11 +14,12 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.SuperType; import mage.constants.Zone; -import mage.filter.FilterCard; import mage.filter.StaticFilters; import mage.target.TargetPermanent; import mage.target.common.TargetCardInHand; -import mage.target.targetadjustment.XTargetsAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; + +import java.util.UUID; /** * @@ -42,7 +42,7 @@ public final class AlexiZephyrMage extends CardImpl { ability.addCost(new TapSourceCost()); ability.addCost(new DiscardTargetCost(new TargetCardInHand(2, StaticFilters.FILTER_CARD_CARDS))); ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_CREATURES)); - ability.setTargetAdjuster(XTargetsAdjuster.instance); + ability.setTargetAdjuster(new XTargetsCountAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/a/Archipelagore.java b/Mage.Sets/src/mage/cards/a/Archipelagore.java index 276ce4a252b..01359797495 100644 --- a/Mage.Sets/src/mage/cards/a/Archipelagore.java +++ b/Mage.Sets/src/mage/cards/a/Archipelagore.java @@ -11,9 +11,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -37,7 +36,8 @@ public final class Archipelagore extends CardImpl { "tap up to X target creatures, where X is the number of times this creature has mutated." )); ability.addEffect(new DontUntapInControllersNextUntapStepTargetEffect("Those creatures")); - ability.setTargetAdjuster(ArchipelagoreAdjuster.instance); + ability.setTargetAdjuster(new TargetsCountAdjuster(SourceMutatedCount.instance)); + ability.addTarget(new TargetCreaturePermanent(0, 1)); this.addAbility(ability); } @@ -50,14 +50,3 @@ public final class Archipelagore extends CardImpl { return new Archipelagore(this); } } - -enum ArchipelagoreAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int mutateCount = SourceMutatedCount.instance.calculate(game, ability, null); - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(0, mutateCount)); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/a/AryelKnightOfWindgrace.java b/Mage.Sets/src/mage/cards/a/AryelKnightOfWindgrace.java index 86c2e1964e0..ad4635320dd 100644 --- a/Mage.Sets/src/mage/cards/a/AryelKnightOfWindgrace.java +++ b/Mage.Sets/src/mage/cards/a/AryelKnightOfWindgrace.java @@ -3,7 +3,6 @@ package mage.cards.a; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.VariableCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapVariableTargetCost; import mage.abilities.costs.mana.ManaCostsImpl; @@ -14,13 +13,10 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.common.FilterControlledPermanent; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.PowerPredicate; import mage.filter.predicate.permanent.TappedPredicate; -import mage.game.Game; import mage.game.permanent.token.KnightToken; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.PowerTargetAdjuster; import java.util.UUID; @@ -58,7 +54,8 @@ public final class AryelKnightOfWindgrace extends CardImpl { .setText("Destroy target creature with power X or less"), new ManaCostsImpl<>("{B}")); ability.addCost(new TapSourceCost()); ability.addCost(new TapVariableTargetCost(filter)); - ability.setTargetAdjuster(AryelKnightOfWindgraceAdjuster.instance); + ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS)); + ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } @@ -71,19 +68,3 @@ public final class AryelKnightOfWindgrace extends CardImpl { return new AryelKnightOfWindgrace(this); } } - -enum AryelKnightOfWindgraceAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int value = 0; - for (VariableCost cost : ability.getCosts().getVariableCosts()) { - value = cost.getAmount(); - } - FilterCreaturePermanent filterCreaturePermanent = new FilterCreaturePermanent("creature with power " + value + " or less"); - filterCreaturePermanent.add(new PowerPredicate(ComparisonType.FEWER_THAN, value + 1)); - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(filterCreaturePermanent)); - } -} diff --git a/Mage.Sets/src/mage/cards/a/AureliasVindicator.java b/Mage.Sets/src/mage/cards/a/AureliasVindicator.java index 84d0b553b42..6926a974c8d 100644 --- a/Mage.Sets/src/mage/cards/a/AureliasVindicator.java +++ b/Mage.Sets/src/mage/cards/a/AureliasVindicator.java @@ -18,10 +18,8 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; import mage.filter.StaticFilters; -import mage.game.Game; -import mage.target.Target; import mage.target.common.TargetCardInGraveyardBattlefieldOrStack; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -52,7 +50,10 @@ public final class AureliasVindicator extends CardImpl { // When Aurelia's Vindicator is turned face up, exile up to X other target creatures from the battlefield and/or creature cards from graveyards. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new ExileTargetForSourceEffect() .setText("exile up to X other target creatures from the battlefield and/or creature cards from graveyards")); - ability.setTargetAdjuster(AureliasVindicatorAdjuster.instance); + ability.setTargetAdjuster(new TargetsCountAdjuster(MorphManacostVariableValue.instance)); + ability.addTarget(new TargetCardInGraveyardBattlefieldOrStack( + 0, 1, StaticFilters.FILTER_CARD_CREATURE, StaticFilters.FILTER_PERMANENT_CREATURES + )); this.addAbility(ability); // When Aurelia's Vindicator leaves the battlefield, return the exiled cards to their owners' hands. @@ -69,17 +70,3 @@ public final class AureliasVindicator extends CardImpl { return new AureliasVindicator(this); } } - -enum AureliasVindicatorAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = MorphManacostVariableValue.instance.calculate(game, ability, null); - Target target = new TargetCardInGraveyardBattlefieldOrStack( - 0, xValue, StaticFilters.FILTER_CARD_CREATURE, StaticFilters.FILTER_PERMANENT_CREATURES - ); - ability.addTarget(target); - } -} diff --git a/Mage.Sets/src/mage/cards/a/Avalanche.java b/Mage.Sets/src/mage/cards/a/Avalanche.java index c49ca665da0..eda7c9943d0 100644 --- a/Mage.Sets/src/mage/cards/a/Avalanche.java +++ b/Mage.Sets/src/mage/cards/a/Avalanche.java @@ -1,7 +1,7 @@ package mage.cards.a; -import mage.abilities.Ability; +import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -9,9 +9,8 @@ import mage.constants.CardType; import mage.constants.SuperType; import mage.filter.FilterPermanent; import mage.filter.common.FilterLandPermanent; -import mage.game.Game; import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -19,13 +18,20 @@ import java.util.UUID; * @author TheElk801 */ public final class Avalanche extends CardImpl { + private static final FilterPermanent filter = new FilterLandPermanent("snow lands"); + + static { + filter.add(SuperType.SNOW.getPredicate()); + } public Avalanche(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{2}{R}{R}"); // Destroy X target snow lands. this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target snow lands")); - this.getSpellAbility().setTargetAdjuster(AvalancheAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addTarget(new TargetPermanent(1, 1, filter, false)); + } private Avalanche(final Avalanche card) { @@ -37,19 +43,3 @@ public final class Avalanche extends CardImpl { return new Avalanche(this); } } - -enum AvalancheAdjuster implements TargetAdjuster { - instance; - private static final FilterPermanent filter = new FilterLandPermanent("snow lands"); - - static { - filter.add(SuperType.SNOW.getPredicate()); - } - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - ability.addTarget(new TargetPermanent(xValue, xValue, filter, false)); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/b/BackInTown.java b/Mage.Sets/src/mage/cards/b/BackInTown.java index 7a055e4ae04..f27446b86f2 100644 --- a/Mage.Sets/src/mage/cards/b/BackInTown.java +++ b/Mage.Sets/src/mage/cards/b/BackInTown.java @@ -1,15 +1,15 @@ package mage.cards.b; -import mage.abilities.Ability; +import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.FilterCard; +import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.mageobject.OutlawPredicate; -import mage.game.Game; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -17,6 +17,11 @@ import java.util.UUID; * @author TheElk801 */ public final class BackInTown extends CardImpl { + private static final FilterCard filter = new FilterCreatureCard("outlaw cards"); + + static { + filter.add(OutlawPredicate.instance); + } public BackInTown(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{2}{B}"); @@ -24,7 +29,8 @@ public final class BackInTown extends CardImpl { // Return X target outlaw creature cards from your graveyard to the battlefield. this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect() .setText("return X target outlaw creature cards from your graveyard to the battlefield")); - this.getSpellAbility().setTargetAdjuster(BackInTownAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter)); } private BackInTown(final BackInTown card) { @@ -36,18 +42,3 @@ public final class BackInTown extends CardImpl { return new BackInTown(this); } } - -enum BackInTownAdjuster implements TargetAdjuster { - instance; - private static final FilterCard filter = new FilterCard("outlaw cards"); - - static { - filter.add(OutlawPredicate.instance); - } - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard(ability.getManaCostsToPay().getX(), filter)); - } -} diff --git a/Mage.Sets/src/mage/cards/b/BanthaHerd.java b/Mage.Sets/src/mage/cards/b/BanthaHerd.java index 2b334f15833..08b7ad0dff4 100644 --- a/Mage.Sets/src/mage/cards/b/BanthaHerd.java +++ b/Mage.Sets/src/mage/cards/b/BanthaHerd.java @@ -1,21 +1,18 @@ package mage.cards.b; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.dynamicvalue.common.GetMonstrosityXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.MonstrosityAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; -import mage.game.Game; import mage.game.permanent.token.TuskenRaiderToken; -import mage.players.Player; + +import java.util.UUID; /** * @@ -33,7 +30,7 @@ public final class BanthaHerd extends CardImpl { this.addAbility(new MonstrosityAbility("{X}{W}{W}", Integer.MAX_VALUE)); // When Batha Herd becomes monstrous, create X 1/1 white Tusken Raider tokens. - this.addAbility(new BecomesMonstrousSourceTriggeredAbility(new BathaHerdEffect())); + this.addAbility(new BecomesMonstrousSourceTriggeredAbility(new CreateTokenEffect(new TuskenRaiderToken(), GetMonstrosityXValue.instance))); } private BanthaHerd(final BanthaHerd card) { @@ -45,32 +42,3 @@ public final class BanthaHerd extends CardImpl { return new BanthaHerd(this); } } - -class BathaHerdEffect extends OneShotEffect { - - BathaHerdEffect() { - super(Outcome.PutCreatureInPlay); - this.staticText = "create X 1/1 white Tusken Raider tokens"; - } - - private BathaHerdEffect(final BathaHerdEffect effect) { - super(effect); - } - - @Override - public BathaHerdEffect copy() { - return new BathaHerdEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { - return false; - } - - int xValue = ((BecomesMonstrousSourceTriggeredAbility) source).getMonstrosityValue(); - - return new CreateTokenEffect(new TuskenRaiderToken(), xValue).apply(game, source); - } -} diff --git a/Mage.Sets/src/mage/cards/b/BlueSunsTwilight.java b/Mage.Sets/src/mage/cards/b/BlueSunsTwilight.java index 8181631d06e..7f3d05567a3 100644 --- a/Mage.Sets/src/mage/cards/b/BlueSunsTwilight.java +++ b/Mage.Sets/src/mage/cards/b/BlueSunsTwilight.java @@ -10,12 +10,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.Duration; -import mage.filter.FilterPermanent; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; -import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -34,7 +31,8 @@ public final class BlueSunsTwilight extends CardImpl { new CreateTokenCopyTargetEffect(), BlueSunsTwilightCondition.instance, "If X is 5 or more, create a token that's a copy of that creature" )); - this.getSpellAbility().setTargetAdjuster(BlueSunsTwilightAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.OR_LESS)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private BlueSunsTwilight(final BlueSunsTwilight card) { @@ -55,16 +53,3 @@ enum BlueSunsTwilightCondition implements Condition { return source.getManaCostsToPay().getX() >= 5; } } - -enum BlueSunsTwilightAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - FilterPermanent filter = new FilterCreaturePermanent("creature with mana value " + xValue + " or less"); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(filter)); - } -} diff --git a/Mage.Sets/src/mage/cards/b/BuildersBane.java b/Mage.Sets/src/mage/cards/b/BuildersBane.java index 4b038804802..97479995068 100644 --- a/Mage.Sets/src/mage/cards/b/BuildersBane.java +++ b/Mage.Sets/src/mage/cards/b/BuildersBane.java @@ -11,7 +11,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetArtifactPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.HashMap; import java.util.Map; @@ -28,7 +28,7 @@ public final class BuildersBane extends CardImpl { // Destroy X target artifacts. Builder's Bane deals damage to each player equal to the number of artifacts they controlled put into a graveyard this way. this.getSpellAbility().addTarget(new TargetArtifactPermanent()); this.getSpellAbility().addEffect(new BuildersBaneEffect()); - this.getSpellAbility().setTargetAdjuster(BuildersBaneAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); } private BuildersBane(final BuildersBane card) { @@ -41,17 +41,6 @@ public final class BuildersBane extends CardImpl { } } -enum BuildersBaneAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - ability.addTarget(new TargetArtifactPermanent(xValue, xValue)); - } -} - class BuildersBaneEffect extends OneShotEffect { BuildersBaneEffect() { diff --git a/Mage.Sets/src/mage/cards/b/ByForce.java b/Mage.Sets/src/mage/cards/b/ByForce.java index dda33711810..ea7d7ecd960 100644 --- a/Mage.Sets/src/mage/cards/b/ByForce.java +++ b/Mage.Sets/src/mage/cards/b/ByForce.java @@ -1,14 +1,12 @@ package mage.cards.b; -import mage.abilities.Ability; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.game.Game; import mage.target.common.TargetArtifactPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -23,7 +21,7 @@ public final class ByForce extends CardImpl { // Destroy X target artifacts. this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target artifacts")); this.getSpellAbility().addTarget(new TargetArtifactPermanent()); - this.getSpellAbility().setTargetAdjuster(ByForceAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); } private ByForce(final ByForce card) { @@ -35,14 +33,3 @@ public final class ByForce extends CardImpl { return new ByForce(this); } } - -enum ByForceAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - ability.addTarget(new TargetArtifactPermanent(xValue, xValue)); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/c/CandelabraOfTawnos.java b/Mage.Sets/src/mage/cards/c/CandelabraOfTawnos.java index c613eb20e3a..b8b1a80ff8e 100644 --- a/Mage.Sets/src/mage/cards/c/CandelabraOfTawnos.java +++ b/Mage.Sets/src/mage/cards/c/CandelabraOfTawnos.java @@ -1,6 +1,5 @@ package mage.cards.c; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; @@ -13,7 +12,9 @@ import mage.constants.CardType; import mage.constants.Zone; import mage.filter.StaticFilters; import mage.target.TargetPermanent; -import mage.target.targetadjustment.XTargetsAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; + +import java.util.UUID; /** * @@ -30,7 +31,7 @@ public final class CandelabraOfTawnos extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{X}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS)); - ability.setTargetAdjuster(XTargetsAdjuster.instance); + ability.setTargetAdjuster(new XTargetsCountAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/c/CelebornTheWise.java b/Mage.Sets/src/mage/cards/c/CelebornTheWise.java index ae9f4f44985..89280dfbd35 100644 --- a/Mage.Sets/src/mage/cards/c/CelebornTheWise.java +++ b/Mage.Sets/src/mage/cards/c/CelebornTheWise.java @@ -1,11 +1,9 @@ package mage.cards.c; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.AttacksWithCreaturesTriggeredAbility; import mage.abilities.common.ScryTriggeredAbility; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.Effect; +import mage.abilities.dynamicvalue.common.GetScryAmount; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.keyword.ScryEffect; import mage.cards.CardImpl; @@ -15,7 +13,6 @@ import mage.constants.Duration; import mage.constants.SubType; import mage.constants.SuperType; import mage.filter.FilterPermanent; -import mage.game.Game; import java.util.UUID; @@ -42,7 +39,7 @@ public final class CelebornTheWise extends CardImpl { // Whenever you scry, Celeborn the Wise gets +1/+1 until end of turn for each card you looked at while scrying this way. this.addAbility(new ScryTriggeredAbility(new BoostSourceEffect( - CelebornTheWiseValue.instance, CelebornTheWiseValue.instance, Duration.EndOfTurn + GetScryAmount.instance, GetScryAmount.instance, Duration.EndOfTurn ))); } @@ -55,27 +52,3 @@ public final class CelebornTheWise extends CardImpl { return new CelebornTheWise(this); } } - -enum CelebornTheWiseValue implements DynamicValue { - instance; - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - return (Integer) effect.getValue("amount"); - } - - @Override - public CelebornTheWiseValue copy() { - return this; - } - - @Override - public String getMessage() { - return "card looked at while scrying this way"; - } - - @Override - public String toString() { - return "1"; - } -} diff --git a/Mage.Sets/src/mage/cards/c/ChampionOfStraySouls.java b/Mage.Sets/src/mage/cards/c/ChampionOfStraySouls.java index a4c6a7b8ca1..b808ed365c4 100644 --- a/Mage.Sets/src/mage/cards/c/ChampionOfStraySouls.java +++ b/Mage.Sets/src/mage/cards/c/ChampionOfStraySouls.java @@ -6,7 +6,6 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeXTargetCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.PutOnLibrarySourceEffect; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; @@ -18,9 +17,8 @@ import mage.constants.Zone; import mage.filter.StaticFilters; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.mageobject.AnotherPredicate; -import mage.game.Game; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -54,8 +52,8 @@ public final class ChampionOfStraySouls extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{3}{B}{B}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeXTargetCost(filter)); - ability.addTarget(new TargetCardInYourGraveyard(0, Integer.MAX_VALUE, StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD)); - ability.setTargetAdjuster(ChampionOfStraySoulsAdjuster.instance); + ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD)); + ability.setTargetAdjuster(new XTargetsCountAdjuster()); this.addAbility(ability); // {5}{B}{B}: Put Champion of Stray Souls on top of your library from your graveyard. @@ -73,18 +71,3 @@ public final class ChampionOfStraySouls extends CardImpl { return new ChampionOfStraySouls(this); } } - -enum ChampionOfStraySoulsAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - for (Effect effect : ability.getEffects()) { - if (effect instanceof ReturnFromGraveyardToBattlefieldTargetEffect) { - int xValue = GetXValue.instance.calculate(game, ability, null); - ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard(xValue, xValue, StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD)); - } - } - } -} diff --git a/Mage.Sets/src/mage/cards/c/ChangeOfPlans.java b/Mage.Sets/src/mage/cards/c/ChangeOfPlans.java index 4ec4a4f7507..91f363b551e 100644 --- a/Mage.Sets/src/mage/cards/c/ChangeOfPlans.java +++ b/Mage.Sets/src/mage/cards/c/ChangeOfPlans.java @@ -16,7 +16,7 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.Objects; import java.util.Set; @@ -33,7 +33,8 @@ public final class ChangeOfPlans extends CardImpl { // Each of X target creatures you control connive. You may have any number of them phase out. this.getSpellAbility().addEffect(new ChangeOfPlansEffect()); - this.getSpellAbility().setTargetAdjuster(ChangeOfPlansAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); } private ChangeOfPlans(final ChangeOfPlans card) { @@ -46,16 +47,6 @@ public final class ChangeOfPlans extends CardImpl { } } -enum ChangeOfPlansAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetControlledCreaturePermanent(ability.getManaCostsToPay().getX())); - } -} - class ChangeOfPlansEffect extends OneShotEffect { ChangeOfPlansEffect() { diff --git a/Mage.Sets/src/mage/cards/c/ChokingVines.java b/Mage.Sets/src/mage/cards/c/ChokingVines.java index f4eb738e9ca..e89c8aaec5d 100644 --- a/Mage.Sets/src/mage/cards/c/ChokingVines.java +++ b/Mage.Sets/src/mage/cards/c/ChokingVines.java @@ -1,6 +1,5 @@ package mage.cards.c; -import mage.abilities.Ability; import mage.abilities.common.CastOnlyDuringPhaseStepSourceAbility; import mage.abilities.effects.common.BecomeBlockedTargetEffect; import mage.abilities.effects.common.DamageTargetEffect; @@ -9,9 +8,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.PhaseStep; import mage.filter.StaticFilters; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -32,7 +30,8 @@ public final class ChokingVines extends CardImpl { .setText("X target attacking creatures become blocked.")); this.getSpellAbility().addEffect(new DamageTargetEffect(1) .setText("{this} deals 1 damage to each of those creatures")); - this.getSpellAbility().setTargetAdjuster(ChokingVinesAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_ATTACKING_CREATURES)); } private ChokingVines(final ChokingVines card) { @@ -44,14 +43,3 @@ public final class ChokingVines extends CardImpl { return new ChokingVines(this); } } - -enum ChokingVinesAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int x = ability.getManaCostsToPay().getX(); - ability.addTarget(new TargetCreaturePermanent(x, x, StaticFilters.FILTER_ATTACKING_CREATURES, false)); - } -} diff --git a/Mage.Sets/src/mage/cards/c/CometStorm.java b/Mage.Sets/src/mage/cards/c/CometStorm.java index 57daff50b2d..33ef207045f 100644 --- a/Mage.Sets/src/mage/cards/c/CometStorm.java +++ b/Mage.Sets/src/mage/cards/c/CometStorm.java @@ -1,6 +1,7 @@ package mage.cards.c; import mage.abilities.Ability; +import mage.abilities.dynamicvalue.IntPlusDynamicValue; import mage.abilities.dynamicvalue.common.MultikickerCount; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.MultikickerAbility; @@ -12,7 +13,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetAnyTarget; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -30,7 +31,8 @@ public final class CometStorm extends CardImpl { // Choose any target, then choose another any target for each time Comet Storm was kicked. Comet Storm deals X damage to each of them. this.getSpellAbility().addEffect(new CometStormEffect()); this.getSpellAbility().addTarget(new TargetAnyTarget(1)); - this.getSpellAbility().setTargetAdjuster(CometStormAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(new IntPlusDynamicValue(1, MultikickerCount.instance))); + this.getSpellAbility().addTarget(new TargetAnyTarget()); } private CometStorm(final CometStorm card) { @@ -43,17 +45,6 @@ public final class CometStorm extends CardImpl { } } -enum CometStormAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int numbTargets = MultikickerCount.instance.calculate(game, ability, null) + 1; - ability.addTarget(new TargetAnyTarget(numbTargets)); - } -} - class CometStormEffect extends OneShotEffect { CometStormEffect() { diff --git a/Mage.Sets/src/mage/cards/c/CrackleWithPower.java b/Mage.Sets/src/mage/cards/c/CrackleWithPower.java index af8dbc04e4e..4f4d52a3fcb 100644 --- a/Mage.Sets/src/mage/cards/c/CrackleWithPower.java +++ b/Mage.Sets/src/mage/cards/c/CrackleWithPower.java @@ -1,6 +1,5 @@ package mage.cards.c; -import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; import mage.abilities.dynamicvalue.common.ManacostVariableValue; @@ -8,9 +7,8 @@ import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.game.Game; import mage.target.common.TargetAnyTarget; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -28,7 +26,8 @@ public final class CrackleWithPower extends CardImpl { this.getSpellAbility().addEffect( new DamageTargetEffect(value).setText("{this} deals five times X damage to each of up to X targets") ); - this.getSpellAbility().setTargetAdjuster(CrackleWithPowerAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetAnyTarget(0, 1)); } private CrackleWithPower(final CrackleWithPower card) { @@ -40,13 +39,3 @@ public final class CrackleWithPower extends CardImpl { return new CrackleWithPower(this); } } - -enum CrackleWithPowerAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetAnyTarget(0, ability.getManaCostsToPay().getX())); - } -} diff --git a/Mage.Sets/src/mage/cards/c/CurseOfTheSwine.java b/Mage.Sets/src/mage/cards/c/CurseOfTheSwine.java index 46e3ad757e5..6599d781239 100644 --- a/Mage.Sets/src/mage/cards/c/CurseOfTheSwine.java +++ b/Mage.Sets/src/mage/cards/c/CurseOfTheSwine.java @@ -2,25 +2,21 @@ package mage.cards.c; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; +import mage.cards.*; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.game.permanent.PermanentToken; import mage.game.permanent.token.Boar2Token; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.HashMap; import java.util.Map; import java.util.UUID; -import mage.cards.Card; -import mage.cards.Cards; -import mage.cards.CardsImpl; -import mage.game.permanent.PermanentToken; /** * @author LevelX2 @@ -34,7 +30,8 @@ public final class CurseOfTheSwine extends CardImpl { this.getSpellAbility().addEffect(new CurseOfTheSwineEffect()); // Correct number of targets will be set in adjustTargets - this.getSpellAbility().setTargetAdjuster(CurseOfTheSwineAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } @@ -48,16 +45,6 @@ public final class CurseOfTheSwine extends CardImpl { } } -enum CurseOfTheSwineAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX())); - } -} - class CurseOfTheSwineEffect extends OneShotEffect { CurseOfTheSwineEffect() { diff --git a/Mage.Sets/src/mage/cards/c/CustodiSoulcaller.java b/Mage.Sets/src/mage/cards/c/CustodiSoulcaller.java index 96697093d0d..15c1568792c 100644 --- a/Mage.Sets/src/mage/cards/c/CustodiSoulcaller.java +++ b/Mage.Sets/src/mage/cards/c/CustodiSoulcaller.java @@ -4,6 +4,8 @@ package mage.cards.c; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.abilities.keyword.MeleeAbility; import mage.cards.CardImpl; @@ -12,15 +14,11 @@ import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.SubType; import mage.constants.WatcherScope; -import mage.filter.FilterCard; -import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.ManaValueTargetAdjuster; import mage.watchers.Watcher; import java.util.*; @@ -29,7 +27,6 @@ import java.util.*; * @author L_J */ public final class CustodiSoulcaller extends CardImpl { - public CustodiSoulcaller(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{W}"); this.subtype.add(SubType.HUMAN); @@ -43,7 +40,8 @@ public final class CustodiSoulcaller extends CardImpl { // Whenever Custodi Soulcaller attacks, return target creature card with converted mana cost X or less from your graveyard to the battlefield, where X is the number of players you attacked with a creature this combat. Ability ability = new AttacksTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect().setText("return target creature card with mana value X or less from your graveyard to the battlefield, where X is the number of players you attacked this combat"), false); ability.addWatcher(new CustodiSoulcallerWatcher()); - ability.setTargetAdjuster(CustodiSoulcallerAdjuster.instance); + ability.setTargetAdjuster(new ManaValueTargetAdjuster(CustodiSoulcallerValue.instance, ComparisonType.OR_LESS)); + ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); this.addAbility(ability); } @@ -57,21 +55,26 @@ public final class CustodiSoulcaller extends CardImpl { } } -enum CustodiSoulcallerAdjuster implements TargetAdjuster { +enum CustodiSoulcallerValue implements DynamicValue { instance; @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); + public int calculate(Game game, Ability sourceAbility, Effect effect) { CustodiSoulcallerWatcher watcher = game.getState().getWatcher(CustodiSoulcallerWatcher.class); - Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(ability.getSourceId()); if (watcher != null) { - int xValue = watcher.getNumberOfAttackedPlayers(sourcePermanent.getControllerId()); - FilterCard filter = new FilterCard("creature card with mana value " + xValue + " or less"); - filter.add(CardType.CREATURE.getPredicate()); - filter.add(Predicates.or(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue), new ManaValuePredicate(ComparisonType.FEWER_THAN, xValue))); - ability.getTargets().add(new TargetCardInYourGraveyard(filter)); + return watcher.getNumberOfAttackedPlayers(sourceAbility.getControllerId()); } + return 0; + } + + @Override + public DynamicValue copy() { + return instance; + } + + @Override + public String getMessage() { + return ""; } } diff --git a/Mage.Sets/src/mage/cards/d/DeathDenied.java b/Mage.Sets/src/mage/cards/d/DeathDenied.java index a86ee328305..2ec4ae04fa8 100644 --- a/Mage.Sets/src/mage/cards/d/DeathDenied.java +++ b/Mage.Sets/src/mage/cards/d/DeathDenied.java @@ -1,18 +1,15 @@ package mage.cards.d; -import mage.abilities.Ability; 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.constants.SubType; -import mage.filter.common.FilterCreatureCard; -import mage.game.Game; -import mage.target.Target; +import mage.filter.StaticFilters; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -29,7 +26,8 @@ public final class DeathDenied extends CardImpl { Effect effect = new ReturnFromGraveyardToHandTargetEffect(); effect.setText("Return X target creature cards from your graveyard to your hand"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().setTargetAdjuster(DeathDeniedAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD)); } private DeathDenied(final DeathDenied card) { @@ -41,15 +39,3 @@ public final class DeathDenied extends CardImpl { return new DeathDenied(this); } } - -enum DeathDeniedAdjuster 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(new StringBuilder(xValue).append(xValue != 1 ? " creature cards" : "creature card").append(" from your graveyard").toString())); - ability.addTarget(target); - } -} diff --git a/Mage.Sets/src/mage/cards/d/DeathKiss.java b/Mage.Sets/src/mage/cards/d/DeathKiss.java index 8e48dc550a8..ae3109dc0f9 100644 --- a/Mage.Sets/src/mage/cards/d/DeathKiss.java +++ b/Mage.Sets/src/mage/cards/d/DeathKiss.java @@ -4,6 +4,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility; +import mage.abilities.dynamicvalue.common.GetMonstrosityXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.combat.GoadTargetEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -19,7 +20,7 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import mage.target.targetpointer.FixedTarget; import java.util.Set; @@ -44,9 +45,12 @@ public final class DeathKiss extends CardImpl { this.addAbility(new MonstrosityAbility("{X}{X}{R}", Integer.MAX_VALUE)); // When Death Kiss becomes monstrous, goad up to X target creatures your opponents control. - this.addAbility(new BecomesMonstrousSourceTriggeredAbility( + Ability ability = new BecomesMonstrousSourceTriggeredAbility( new GoadTargetEffect().setText("goad up to X target creatures your opponents control") - ).setTargetAdjuster(DeathKissAdjuster.instance)); + ); + ability.setTargetAdjuster(new TargetsCountAdjuster(GetMonstrosityXValue.instance)); + ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE)); + this.addAbility(ability); } private DeathKiss(final DeathKiss card) { @@ -59,17 +63,6 @@ public final class DeathKiss extends CardImpl { } } -enum DeathKissAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ((BecomesMonstrousSourceTriggeredAbility) ability).getMonstrosityValue(); - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(0, xValue, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE)); - } -} - class DeathKissAdjusterTriggeredAbility extends TriggeredAbilityImpl { DeathKissAdjusterTriggeredAbility() { diff --git a/Mage.Sets/src/mage/cards/d/DeepfireElemental.java b/Mage.Sets/src/mage/cards/d/DeepfireElemental.java index 7434abbf564..72c553a4c1f 100644 --- a/Mage.Sets/src/mage/cards/d/DeepfireElemental.java +++ b/Mage.Sets/src/mage/cards/d/DeepfireElemental.java @@ -1,6 +1,5 @@ package mage.cards.d; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -14,7 +13,9 @@ import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.target.TargetPermanent; -import mage.target.targetadjustment.XCMCPermanentAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; + +import java.util.UUID; /** * @@ -41,7 +42,7 @@ public final class DeepfireElemental extends CardImpl { // {X}{X}{1}: Destroy target artifact or creature with converted mana cost X. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl<>("{X}{X}{1}")); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(XCMCPermanentAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/d/DeepwoodElder.java b/Mage.Sets/src/mage/cards/d/DeepwoodElder.java index c3e9a178184..adb80053626 100644 --- a/Mage.Sets/src/mage/cards/d/DeepwoodElder.java +++ b/Mage.Sets/src/mage/cards/d/DeepwoodElder.java @@ -1,6 +1,5 @@ package mage.cards.d; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -10,22 +9,23 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.Target; import mage.target.TargetPermanent; -import mage.target.targetadjustment.XTargetsAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class DeepwoodElder extends CardImpl { @@ -43,7 +43,7 @@ public final class DeepwoodElder extends CardImpl { ability.addCost(new TapSourceCost()); ability.addCost(new DiscardCardCost()); ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS)); - ability.setTargetAdjuster(XTargetsAdjuster.instance); + ability.setTargetAdjuster(new XTargetsCountAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/d/Detonate.java b/Mage.Sets/src/mage/cards/d/Detonate.java index 2a0996ce823..c06657376a3 100644 --- a/Mage.Sets/src/mage/cards/d/Detonate.java +++ b/Mage.Sets/src/mage/cards/d/Detonate.java @@ -1,7 +1,6 @@ package mage.cards.d; -import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageTargetControllerEffect; @@ -9,12 +8,9 @@ import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.filter.common.FilterArtifactPermanent; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; import mage.target.common.TargetArtifactPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -32,7 +28,8 @@ public final class Detonate extends CardImpl { Effect effect = new DamageTargetControllerEffect(ManacostVariableValue.REGULAR); effect.setText("{this} deals X damage to that artifact's controller"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().setTargetAdjuster(DetonateAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster()); + this.getSpellAbility().addTarget(new TargetArtifactPermanent()); } private Detonate(final Detonate card) { @@ -44,16 +41,3 @@ public final class Detonate extends CardImpl { return new Detonate(this); } } - -enum DetonateAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - FilterArtifactPermanent filter = new FilterArtifactPermanent("artifact with mana value X"); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.addTarget(new TargetArtifactPermanent(filter)); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/d/Disembowel.java b/Mage.Sets/src/mage/cards/d/Disembowel.java index d813944a4fc..44b391c17e0 100644 --- a/Mage.Sets/src/mage/cards/d/Disembowel.java +++ b/Mage.Sets/src/mage/cards/d/Disembowel.java @@ -1,17 +1,12 @@ package mage.cards.d; -import mage.abilities.Ability; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -25,7 +20,8 @@ public final class Disembowel extends CardImpl { // Destroy target creature with converted mana cost X. this.getSpellAbility().addEffect(new DestroyTargetEffect("destroy target creature with mana value X")); - this.getSpellAbility().setTargetAdjuster(DisembowelAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private Disembowel(final Disembowel card) { @@ -37,16 +33,3 @@ public final class Disembowel extends CardImpl { return new Disembowel(this); } } - -enum DisembowelAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with mana value X"); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.addTarget(new TargetCreaturePermanent(filter)); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/d/DisorderInTheCourt.java b/Mage.Sets/src/mage/cards/d/DisorderInTheCourt.java index 993de177287..0b36e1a9213 100644 --- a/Mage.Sets/src/mage/cards/d/DisorderInTheCourt.java +++ b/Mage.Sets/src/mage/cards/d/DisorderInTheCourt.java @@ -15,7 +15,7 @@ import mage.constants.Outcome; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import mage.target.targetpointer.FixedTargets; import mage.util.CardUtil; @@ -35,7 +35,8 @@ public final class DisorderInTheCourt extends CardImpl { // Exile X target creatures, then investigate X times. Return the exiled cards to the battlefield tapped under their owners' control at the beginning of the next end step. this.getSpellAbility().addEffect(new DisorderInTheCourtEffect()); - this.getSpellAbility().setTargetAdjuster(DisorderInTheCourtAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private DisorderInTheCourt(final DisorderInTheCourt card) { @@ -48,16 +49,6 @@ public final class DisorderInTheCourt extends CardImpl { } } -enum DisorderInTheCourtAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX())); - } -} - class DisorderInTheCourtEffect extends OneShotEffect { DisorderInTheCourtEffect() { diff --git a/Mage.Sets/src/mage/cards/d/DistortingWake.java b/Mage.Sets/src/mage/cards/d/DistortingWake.java index 9c9536b1c26..1c1ca7dcf8b 100644 --- a/Mage.Sets/src/mage/cards/d/DistortingWake.java +++ b/Mage.Sets/src/mage/cards/d/DistortingWake.java @@ -1,17 +1,13 @@ package mage.cards.d; -import mage.abilities.Ability; 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.common.FilterNonlandPermanent; -import mage.game.Game; -import mage.target.Target; import mage.target.common.TargetNonlandPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -27,7 +23,8 @@ public final class DistortingWake extends CardImpl { Effect effect = new ReturnToHandTargetEffect(); effect.setText("Return X target nonland permanents to their owners' hands"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().setTargetAdjuster(DistortingWakeAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetNonlandPermanent()); } private DistortingWake(final DistortingWake card) { @@ -39,16 +36,3 @@ public final class DistortingWake extends CardImpl { return new DistortingWake(this); } } - -enum DistortingWakeAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - Target target = new TargetNonlandPermanent(xValue, xValue, - new FilterNonlandPermanent(xValue + " target nonland permanent(s)"), false); - ability.getTargets().clear(); - ability.getTargets().add(target); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/d/Dominate.java b/Mage.Sets/src/mage/cards/d/Dominate.java index 1449ca8b771..b8b10c2bf99 100644 --- a/Mage.Sets/src/mage/cards/d/Dominate.java +++ b/Mage.Sets/src/mage/cards/d/Dominate.java @@ -1,6 +1,5 @@ package mage.cards.d; -import mage.abilities.Ability; import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -8,11 +7,8 @@ import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.Duration; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -27,7 +23,7 @@ public final class Dominate extends CardImpl { // Gain control of target creature with converted mana cost X or less. this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.Custom, true)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature with mana value X or less"))); - this.getSpellAbility().setTargetAdjuster(DominateAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.OR_LESS)); } private Dominate(final Dominate card) { @@ -39,16 +35,3 @@ public final class Dominate extends CardImpl { return new Dominate(this); } } - -enum DominateAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with mana value X or less"); - filter.add(Predicates.not(new ManaValuePredicate(ComparisonType.MORE_THAN, xValue))); - ability.addTarget(new TargetCreaturePermanent(filter)); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/d/Doppelgang.java b/Mage.Sets/src/mage/cards/d/Doppelgang.java index b8b2217b7bf..f059102ddcd 100644 --- a/Mage.Sets/src/mage/cards/d/Doppelgang.java +++ b/Mage.Sets/src/mage/cards/d/Doppelgang.java @@ -7,11 +7,10 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -25,7 +24,8 @@ public final class Doppelgang extends CardImpl { // For each of X target permanents, create X tokens that are copies of that permanent. this.getSpellAbility().addEffect(new DoppelgangEffect()); - this.getSpellAbility().setTargetAdjuster(DoppelgangAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetPermanent()); } private Doppelgang(final Doppelgang card) { @@ -38,16 +38,6 @@ public final class Doppelgang extends CardImpl { } } -enum DoppelgangAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(ability.getManaCostsToPay().getX(), StaticFilters.FILTER_PERMANENTS)); - } -} - class DoppelgangEffect extends OneShotEffect { DoppelgangEffect() { diff --git a/Mage.Sets/src/mage/cards/d/DregsOfSorrow.java b/Mage.Sets/src/mage/cards/d/DregsOfSorrow.java index 15d6e4b949c..08c913a156b 100644 --- a/Mage.Sets/src/mage/cards/d/DregsOfSorrow.java +++ b/Mage.Sets/src/mage/cards/d/DregsOfSorrow.java @@ -1,6 +1,5 @@ package mage.cards.d; -import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -8,9 +7,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.StaticFilters; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -25,7 +23,8 @@ public final class DregsOfSorrow extends CardImpl { // Destroy X target nonblack creatures. Draw X cards. this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target nonblack creatures")); this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR)); - this.getSpellAbility().setTargetAdjuster(DregsOfSorrowAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_PERMANENT_CREATURES_NON_BLACK)); } private DregsOfSorrow(final DregsOfSorrow card) { @@ -37,14 +36,3 @@ public final class DregsOfSorrow extends CardImpl { return new DregsOfSorrow(this); } } - -enum DregsOfSorrowAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - ability.addTarget(new TargetCreaturePermanent(xValue, xValue, StaticFilters.FILTER_PERMANENT_CREATURES_NON_BLACK, false)); - } -} diff --git a/Mage.Sets/src/mage/cards/e/EliminateTheCompetition.java b/Mage.Sets/src/mage/cards/e/EliminateTheCompetition.java index e921fc9c0e9..7659d17b37d 100644 --- a/Mage.Sets/src/mage/cards/e/EliminateTheCompetition.java +++ b/Mage.Sets/src/mage/cards/e/EliminateTheCompetition.java @@ -1,18 +1,16 @@ package mage.cards.e; -import java.util.UUID; -import mage.abilities.Ability; import mage.abilities.costs.common.SacrificeXTargetCost; -import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; + +import java.util.UUID; /** * @@ -31,7 +29,7 @@ public final class EliminateTheCompetition extends CardImpl { effect.setText("Destroy X target creatures"); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().setTargetAdjuster(EliminateTheCompetitionAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); } private EliminateTheCompetition(final EliminateTheCompetition card) { @@ -43,14 +41,3 @@ public final class EliminateTheCompetition extends CardImpl { return new EliminateTheCompetition(this); } } - -enum EliminateTheCompetitionAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int sac = GetXValue.instance.calculate(game, ability, null); - ability.addTarget(new TargetCreaturePermanent(sac, sac)); - } -} diff --git a/Mage.Sets/src/mage/cards/e/ElrondMasterOfHealing.java b/Mage.Sets/src/mage/cards/e/ElrondMasterOfHealing.java index 77509c6b7a9..6e58acd2d4e 100644 --- a/Mage.Sets/src/mage/cards/e/ElrondMasterOfHealing.java +++ b/Mage.Sets/src/mage/cards/e/ElrondMasterOfHealing.java @@ -4,6 +4,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.common.ScryTriggeredAbility; +import mage.abilities.dynamicvalue.common.GetScryAmount; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.cards.CardImpl; @@ -14,9 +15,8 @@ import mage.constants.SubType; import mage.constants.SuperType; import mage.counters.CounterType; import mage.filter.StaticFilters; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -35,10 +35,12 @@ public final class ElrondMasterOfHealing extends CardImpl { this.toughness = new MageInt(4); // Whenever you scry, put a +1/+1 counter on each of up to X target creatures, where X is the number of cards looked at while scrying this way. - this.addAbility(new ScryTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()) + Ability ability = new ScryTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()) .setText("put a +1/+1 counter on each of up to X target creatures, " + - "where X is the number of cards looked at while scrying this way")) - .setTargetAdjuster(ElrondMasterOfHealingAdjuster.instance)); + "where X is the number of cards looked at while scrying this way")); + ability.addTarget(new TargetCreaturePermanent(0, 1)); + ability.setTargetAdjuster(new TargetsCountAdjuster(GetScryAmount.instance)); + this.addAbility(ability); // Whenever a creature you control with a +1/+1 counter on it becomes the target of a spell or ability an opponent controls, you may draw a card. this.addAbility(new BecomesTargetAnyTriggeredAbility(new DrawCardSourceControllerEffect(1), @@ -55,19 +57,3 @@ public final class ElrondMasterOfHealing extends CardImpl { return new ElrondMasterOfHealing(this); } } - -enum ElrondMasterOfHealingAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int amount = ability - .getEffects() - .stream() - .mapToInt(effect -> (Integer) effect.getValue("amount")) - .findFirst() - .orElse(0); - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(0, amount)); - } -} diff --git a/Mage.Sets/src/mage/cards/e/ElvishMariner.java b/Mage.Sets/src/mage/cards/e/ElvishMariner.java index 29f696f46e1..f42efc488a4 100644 --- a/Mage.Sets/src/mage/cards/e/ElvishMariner.java +++ b/Mage.Sets/src/mage/cards/e/ElvishMariner.java @@ -4,15 +4,15 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.ScryTriggeredAbility; +import mage.abilities.dynamicvalue.common.GetScryAmount; import mage.abilities.effects.common.TapTargetEffect; import mage.abilities.effects.keyword.ScryEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.game.Game; import mage.target.common.TargetNonlandPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -33,10 +33,13 @@ public final class ElvishMariner extends CardImpl { this.addAbility(new AttacksTriggeredAbility(new ScryEffect(1, false))); // Whenever you scry, tap up to X target nonland permanents, where X is the number of cards looked at while scrying this way. - this.addAbility(new ScryTriggeredAbility(new TapTargetEffect() + Ability ability = new ScryTriggeredAbility(new TapTargetEffect() .setText("tap up to X target nonland permanents, where X is " + - "the number of cards looked at while scrying this way")) - .setTargetAdjuster(ElvishMarinerAdjuster.instance)); + "the number of cards looked at while scrying this way")); + ability.addTarget(new TargetNonlandPermanent(0, 1)); + ability.setTargetAdjuster(new TargetsCountAdjuster(GetScryAmount.instance)); + this.addAbility(ability); + } private ElvishMariner(final ElvishMariner card) { @@ -48,19 +51,3 @@ public final class ElvishMariner extends CardImpl { return new ElvishMariner(this); } } - -enum ElvishMarinerAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int amount = ability - .getEffects() - .stream() - .mapToInt(effect -> (Integer) effect.getValue("amount")) - .findFirst() - .orElse(0); - ability.getTargets().clear(); - ability.addTarget(new TargetNonlandPermanent(0, amount)); - } -} diff --git a/Mage.Sets/src/mage/cards/e/EnduranceBobblehead.java b/Mage.Sets/src/mage/cards/e/EnduranceBobblehead.java index 6d4aa54aeb2..e80046419a5 100644 --- a/Mage.Sets/src/mage/cards/e/EnduranceBobblehead.java +++ b/Mage.Sets/src/mage/cards/e/EnduranceBobblehead.java @@ -18,9 +18,8 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; import mage.filter.common.FilterControlledPermanent; -import mage.game.Game; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -53,7 +52,7 @@ public final class EnduranceBobblehead extends CardImpl { .setText("and gain indestructible until end of turn, " + "where X is the number of Bobbleheads you control as you activate this ability")); ability.addTarget(new TargetControlledCreaturePermanent(0, 0)); - ability.setTargetAdjuster(new EnduranceBobbleheadAdjuster(xValue)); + ability.setTargetAdjuster(new TargetsCountAdjuster(xValue)); ability.addHint(hint); this.addAbility(ability); } @@ -67,21 +66,3 @@ public final class EnduranceBobblehead extends CardImpl { return new EnduranceBobblehead(this); } } - -// TODO: cleanup after #12107 -class EnduranceBobbleheadAdjuster implements TargetAdjuster { - private final DynamicValue dynamicValue; - - EnduranceBobbleheadAdjuster(DynamicValue value) { - this.dynamicValue = value; - } - - @Override - public void adjustTargets(Ability ability, Game game) { - int count = dynamicValue.calculate(game, ability, null); - ability.getTargets().clear(); - if (count > 0) { - ability.addTarget(new TargetControlledCreaturePermanent(0, count)); - } - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/e/EntDraughtBasin.java b/Mage.Sets/src/mage/cards/e/EntDraughtBasin.java index aabd731d2b7..0f73952585d 100644 --- a/Mage.Sets/src/mage/cards/e/EntDraughtBasin.java +++ b/Mage.Sets/src/mage/cards/e/EntDraughtBasin.java @@ -10,12 +10,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; import mage.counters.CounterType; -import mage.filter.FilterPermanent; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.PowerPredicate; -import mage.game.Game; -import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetadjustment.PowerTargetAdjuster; import java.util.UUID; @@ -34,7 +30,8 @@ public final class EntDraughtBasin extends CardImpl { new ManaCostsImpl<>("{X}") ); ability.addCost(new TapSourceCost()); - ability.setTargetAdjuster(EntDraughtBasinAdjuster.instance); + ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.EQUAL_TO)); + ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } @@ -47,16 +44,3 @@ public final class EntDraughtBasin extends CardImpl { return new EntDraughtBasin(this); } } - -enum EntDraughtBasinAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - FilterPermanent filter = new FilterCreaturePermanent("creature with power " + xValue); - filter.add(new PowerPredicate(ComparisonType.EQUAL_TO, xValue)); - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(filter)); - } -} diff --git a/Mage.Sets/src/mage/cards/e/EntrancingLyre.java b/Mage.Sets/src/mage/cards/e/EntrancingLyre.java index 793d29e54b0..7f2c5237d84 100644 --- a/Mage.Sets/src/mage/cards/e/EntrancingLyre.java +++ b/Mage.Sets/src/mage/cards/e/EntrancingLyre.java @@ -11,12 +11,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.FilterPermanent; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.PowerPredicate; -import mage.game.Game; -import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetadjustment.PowerTargetAdjuster; import java.util.UUID; @@ -37,7 +33,8 @@ public final class EntrancingLyre extends CardImpl { ); ability.addCost(new TapSourceCost()); ability.addEffect(new DontUntapAsLongAsSourceTappedEffect()); - ability.setTargetAdjuster(EntrancingLyreAdjuster.instance); + ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS)); + ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } @@ -50,16 +47,3 @@ public final class EntrancingLyre extends CardImpl { return new EntrancingLyre(this); } } - -enum EntrancingLyreAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - FilterPermanent filter = new FilterCreaturePermanent("creature with power " + xValue + " or less"); - filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.getTargets().clear(); - ability.getTargets().add(new TargetPermanent(filter)); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/e/EntrancingMelody.java b/Mage.Sets/src/mage/cards/e/EntrancingMelody.java index 63c8c80eebd..ac81fb37a4e 100644 --- a/Mage.Sets/src/mage/cards/e/EntrancingMelody.java +++ b/Mage.Sets/src/mage/cards/e/EntrancingMelody.java @@ -1,18 +1,14 @@ package mage.cards.e; -import mage.abilities.Ability; import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.Duration; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -29,7 +25,7 @@ public final class EntrancingMelody extends CardImpl { // Gain control of target creature with converted mana cost X. this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.Custom, true)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); - this.getSpellAbility().setTargetAdjuster(EntrancingMelodyAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster()); } private EntrancingMelody(final EntrancingMelody card) { @@ -41,16 +37,3 @@ public final class EntrancingMelody extends CardImpl { return new EntrancingMelody(this); } } - -enum EntrancingMelodyAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with mana value " + xValue); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.addTarget(new TargetCreaturePermanent(filter)); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/e/EntreatTheDead.java b/Mage.Sets/src/mage/cards/e/EntreatTheDead.java index 281d6af5bd5..f9d65163a9e 100644 --- a/Mage.Sets/src/mage/cards/e/EntreatTheDead.java +++ b/Mage.Sets/src/mage/cards/e/EntreatTheDead.java @@ -1,16 +1,13 @@ package mage.cards.e; -import mage.abilities.Ability; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.abilities.keyword.MiracleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterCreatureCard; -import mage.game.Game; -import mage.target.Target; +import mage.filter.StaticFilters; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -24,7 +21,8 @@ public final class EntreatTheDead extends CardImpl { // Return X target creature cards from your graveyard to the battlefield. this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect().setText("return X target creature cards from your graveyard to the battlefield")); - this.getSpellAbility().setTargetAdjuster(EntreatTheDeadAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD)); // Miracle {X}{B}{B} this.addAbility(new MiracleAbility("{X}{B}{B}")); @@ -39,20 +37,3 @@ public final class EntreatTheDead extends CardImpl { return new EntreatTheDead(this); } } - -enum EntreatTheDeadAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - String filterName = xValue - + (xValue != 1 ? " creature cards" : "creature card") - + " from your graveyard"; - Target target = new TargetCardInYourGraveyard( - xValue, new FilterCreatureCard(filterName) - ); - ability.addTarget(target); - } -} diff --git a/Mage.Sets/src/mage/cards/e/ExtraordinaryJourney.java b/Mage.Sets/src/mage/cards/e/ExtraordinaryJourney.java index db4ab21870c..86b4a8793e7 100644 --- a/Mage.Sets/src/mage/cards/e/ExtraordinaryJourney.java +++ b/Mage.Sets/src/mage/cards/e/ExtraordinaryJourney.java @@ -3,7 +3,6 @@ package mage.cards.e; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -23,7 +22,7 @@ import mage.game.permanent.Permanent; import mage.game.stack.Spell; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import mage.target.targetpointer.FixedTargets; import mage.util.CardUtil; @@ -44,7 +43,8 @@ public final class ExtraordinaryJourney extends CardImpl { // When Extraordinary Journey enters the battlefield, exile up to X target creatures. For each of those cards, its owner may play it for as long as it remains exiled. Ability ability = new EntersBattlefieldTriggeredAbility(new ExtraordinaryJourneyEffect()); - ability.setTargetAdjuster(ExtraordinaryJourneyAdjuster.instance); + ability.setTargetAdjuster(new XTargetsCountAdjuster()); + ability.addTarget(new TargetCreaturePermanent(0, 1)); this.addAbility(ability); // Whenever one or more nontoken creatures enter the battlefield, if one or more of them entered from exile or was cast from exile, you draw a card. This ability triggers only once each turn. @@ -61,16 +61,6 @@ public final class ExtraordinaryJourney extends CardImpl { } } -enum ExtraordinaryJourneyAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(0, ManacostVariableValue.ETB.calculate(game, ability, null))); - } -} - class ExtraordinaryJourneyEffect extends OneShotEffect { ExtraordinaryJourneyEffect() { diff --git a/Mage.Sets/src/mage/cards/f/FinaleOfEternity.java b/Mage.Sets/src/mage/cards/f/FinaleOfEternity.java index e0df5c31738..6dfbc6d6e9d 100644 --- a/Mage.Sets/src/mage/cards/f/FinaleOfEternity.java +++ b/Mage.Sets/src/mage/cards/f/FinaleOfEternity.java @@ -9,14 +9,11 @@ import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterPermanent; import mage.filter.StaticFilters; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.ToughnessPredicate; import mage.game.Game; import mage.players.Player; import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.ToughnessTargetAdjuster; import java.util.UUID; @@ -31,7 +28,8 @@ public final class FinaleOfEternity extends CardImpl { // Destroy up to three target creatures with toughness X or less. If X is 10 or more, return all creature cards from your graveyard to the battlefield. this.getSpellAbility().addEffect(new DestroyTargetEffect().setText("destroy up to three target creatures with toughness X or less")); this.getSpellAbility().addEffect(new FinaleOfEternityEffect()); - this.getSpellAbility().setTargetAdjuster(FinaleOfEternityAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new ToughnessTargetAdjuster(ComparisonType.OR_LESS)); + this.getSpellAbility().addTarget(new TargetPermanent(0, 3, StaticFilters.FILTER_PERMANENT_CREATURES)); } private FinaleOfEternity(final FinaleOfEternity card) { @@ -44,19 +42,6 @@ public final class FinaleOfEternity extends CardImpl { } } -enum FinaleOfEternityAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - FilterPermanent filter = new FilterCreaturePermanent("creatures with toughness " + xValue + " or less"); - filter.add(new ToughnessPredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(0, 3, filter, false)); - } -} - class FinaleOfEternityEffect extends OneShotEffect { FinaleOfEternityEffect() { diff --git a/Mage.Sets/src/mage/cards/f/Firestorm.java b/Mage.Sets/src/mage/cards/f/Firestorm.java index 97a375a1d61..26ad19a95cb 100644 --- a/Mage.Sets/src/mage/cards/f/Firestorm.java +++ b/Mage.Sets/src/mage/cards/f/Firestorm.java @@ -12,9 +12,8 @@ import mage.filter.FilterCard; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.Target; import mage.target.common.TargetAnyTarget; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -31,7 +30,8 @@ public final class Firestorm extends CardImpl { // Firestorm deals X damage to each of X target creatures and/or players. this.getSpellAbility().addEffect(new FirestormEffect()); - this.getSpellAbility().setTargetAdjuster(FirestormAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetAnyTarget()); } private Firestorm(final Firestorm card) { @@ -44,19 +44,6 @@ public final class Firestorm extends CardImpl { } } -enum FirestormAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = GetXValue.instance.calculate(game, ability, null); - if (xValue > 0) { - Target target = new TargetAnyTarget(xValue); - ability.addTarget(target); - } - } -} - class FirestormEffect extends OneShotEffect { FirestormEffect() { diff --git a/Mage.Sets/src/mage/cards/g/GangUp.java b/Mage.Sets/src/mage/cards/g/GangUp.java index 28d60860fb6..03769d5b036 100644 --- a/Mage.Sets/src/mage/cards/g/GangUp.java +++ b/Mage.Sets/src/mage/cards/g/GangUp.java @@ -1,18 +1,15 @@ package mage.cards.g; -import mage.abilities.Ability; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.keyword.AssistAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.PowerPredicate; -import mage.game.Game; +import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.PowerTargetAdjuster; import java.util.UUID; @@ -29,7 +26,8 @@ public final class GangUp extends CardImpl { // Destroy target creature with power X or less. this.getSpellAbility().addEffect(new DestroyTargetEffect("destroy target creature with power X or less")); - this.getSpellAbility().setTargetAdjuster(GangUpAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_PERMANENT_CREATURE)); } private GangUp(final GangUp card) { @@ -41,16 +39,3 @@ public final class GangUp extends CardImpl { return new GangUp(this); } } - -enum GangUpAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - ability.getTargets().clear(); - FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power " + xValue + " or less"); - filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.addTarget(new TargetCreaturePermanent(filter)); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/g/GethLordOfTheVault.java b/Mage.Sets/src/mage/cards/g/GethLordOfTheVault.java index 5fb7e8f7943..9bcb2c90fbe 100644 --- a/Mage.Sets/src/mage/cards/g/GethLordOfTheVault.java +++ b/Mage.Sets/src/mage/cards/g/GethLordOfTheVault.java @@ -15,7 +15,7 @@ import mage.filter.predicate.Predicates; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInGraveyard; -import mage.target.targetadjustment.XCMCGraveyardAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -47,7 +47,7 @@ public final class GethLordOfTheVault extends CardImpl { // {X}{B}: Put target artifact or creature card with converted mana cost X from an opponent's graveyard onto the battlefield under your control tapped. // Then that player puts the top X cards of their library into their graveyard. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GethLordOfTheVaultEffect(), new ManaCostsImpl<>("{X}{B}")); - ability.setTargetAdjuster(XCMCGraveyardAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster()); ability.addTarget(new TargetCardInGraveyard(filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/GhostLitDrifter.java b/Mage.Sets/src/mage/cards/g/GhostLitDrifter.java index 50721cc168d..cc8d843093b 100644 --- a/Mage.Sets/src/mage/cards/g/GhostLitDrifter.java +++ b/Mage.Sets/src/mage/cards/g/GhostLitDrifter.java @@ -13,10 +13,9 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; import mage.filter.StaticFilters; -import mage.game.Game; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -48,7 +47,8 @@ public final class GhostLitDrifter extends CardImpl { FlyingAbility.getInstance(), Duration.EndOfTurn, "X target creatures gain flying until end of turn" )); - ability.setTargetAdjuster(GhostLitDrifterAdjuster.instance); + ability.setTargetAdjuster(new XTargetsCountAdjuster()); + ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } @@ -61,13 +61,3 @@ public final class GhostLitDrifter extends CardImpl { return new GhostLitDrifter(this); } } - -enum GhostLitDrifterAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX())); - } -} diff --git a/Mage.Sets/src/mage/cards/g/GlimpseTheSunGod.java b/Mage.Sets/src/mage/cards/g/GlimpseTheSunGod.java index 6357e6e5788..a26a974a194 100644 --- a/Mage.Sets/src/mage/cards/g/GlimpseTheSunGod.java +++ b/Mage.Sets/src/mage/cards/g/GlimpseTheSunGod.java @@ -1,16 +1,13 @@ package mage.cards.g; -import mage.abilities.Ability; import mage.abilities.effects.common.TapTargetEffect; import mage.abilities.effects.keyword.ScryEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.StaticFilters; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -25,7 +22,8 @@ public final class GlimpseTheSunGod extends CardImpl { // Tap X target creatures. Scry 1. this.getSpellAbility().addEffect(new TapTargetEffect("tap X target creatures")); this.getSpellAbility().addEffect(new ScryEffect(1)); - this.getSpellAbility().setTargetAdjuster(GlimpseTheSunGodAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private GlimpseTheSunGod(final GlimpseTheSunGod card) { @@ -37,14 +35,3 @@ public final class GlimpseTheSunGod extends CardImpl { return new GlimpseTheSunGod(this); } } - -enum GlimpseTheSunGodAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int numberToTap = ability.getManaCostsToPay().getX(); - ability.addTarget(new TargetCreaturePermanent(numberToTap, numberToTap, StaticFilters.FILTER_PERMANENT_CREATURES, false)); - } -} diff --git a/Mage.Sets/src/mage/cards/g/GorillaShaman.java b/Mage.Sets/src/mage/cards/g/GorillaShaman.java index 4f3cfe82e47..842054be47e 100644 --- a/Mage.Sets/src/mage/cards/g/GorillaShaman.java +++ b/Mage.Sets/src/mage/cards/g/GorillaShaman.java @@ -1,6 +1,5 @@ package mage.cards.g; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -14,7 +13,9 @@ import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.target.TargetPermanent; -import mage.target.targetadjustment.XCMCPermanentAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; + +import java.util.UUID; /** * @@ -39,7 +40,7 @@ public final class GorillaShaman extends CardImpl { // {X}{X}{1}: Destroy target noncreature artifact with converted mana cost X. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl<>("{X}{X}{1}")); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(XCMCPermanentAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/Gridlock.java b/Mage.Sets/src/mage/cards/g/Gridlock.java index bb691a14598..32ce19c71e7 100644 --- a/Mage.Sets/src/mage/cards/g/Gridlock.java +++ b/Mage.Sets/src/mage/cards/g/Gridlock.java @@ -1,15 +1,12 @@ package mage.cards.g; -import mage.abilities.Ability; import mage.abilities.effects.common.TapTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterNonlandPermanent; -import mage.game.Game; -import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.common.TargetNonlandPermanent; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -23,7 +20,8 @@ public final class Gridlock extends CardImpl { // Tap X target nonland permanents. this.getSpellAbility().addEffect(new TapTargetEffect("tap X target nonland permanents")); - this.getSpellAbility().setTargetAdjuster(GridlockAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetNonlandPermanent()); } private Gridlock(final Gridlock card) { @@ -35,14 +33,3 @@ public final class Gridlock extends CardImpl { return new Gridlock(this); } } - -enum GridlockAdjuster implements TargetAdjuster { - instance; - private static final FilterNonlandPermanent filter = new FilterNonlandPermanent("nonland permanents"); - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(ability.getManaCostsToPay().getX(), filter)); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/h/HearthKami.java b/Mage.Sets/src/mage/cards/h/HearthKami.java index d83d2ef9b7c..c09637d73a0 100644 --- a/Mage.Sets/src/mage/cards/h/HearthKami.java +++ b/Mage.Sets/src/mage/cards/h/HearthKami.java @@ -1,6 +1,5 @@ package mage.cards.h; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -14,7 +13,9 @@ import mage.constants.SubType; import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.XCMCPermanentAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; + +import java.util.UUID; /** * @author Loki @@ -38,7 +39,7 @@ public final class HearthKami extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl<>("{X}")); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(XCMCPermanentAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/h/HourOfEternity.java b/Mage.Sets/src/mage/cards/h/HourOfEternity.java index e4dcdfb559b..f3e0df78a29 100644 --- a/Mage.Sets/src/mage/cards/h/HourOfEternity.java +++ b/Mage.Sets/src/mage/cards/h/HourOfEternity.java @@ -10,13 +10,12 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.common.FilterCreatureCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.token.Token; import mage.players.Player; -import mage.target.Target; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import mage.util.functions.CopyTokenFunction; import java.util.HashSet; @@ -33,7 +32,8 @@ public final class HourOfEternity extends CardImpl { // Exile X target creature cards from your graveyard. For each card exiled this way, create a token that's a copy of that card, except it's a 4/4 black Zombie. this.getSpellAbility().addEffect(new HourOfEternityEffect()); - this.getSpellAbility().setTargetAdjuster(HourOfEternityAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD)); } private HourOfEternity(final HourOfEternity card) { @@ -46,18 +46,6 @@ public final class HourOfEternity extends CardImpl { } } -enum HourOfEternityAdjuster 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); - } -} - class HourOfEternityEffect extends OneShotEffect { HourOfEternityEffect() { diff --git a/Mage.Sets/src/mage/cards/i/IcyBlast.java b/Mage.Sets/src/mage/cards/i/IcyBlast.java index d80e20507ef..db01c035198 100644 --- a/Mage.Sets/src/mage/cards/i/IcyBlast.java +++ b/Mage.Sets/src/mage/cards/i/IcyBlast.java @@ -1,6 +1,5 @@ package mage.cards.i; -import mage.abilities.Ability; import mage.abilities.condition.LockedInCondition; import mage.abilities.condition.common.FerociousCondition; import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect; @@ -11,9 +10,8 @@ import mage.abilities.hint.common.FerociousHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -34,7 +32,8 @@ public final class IcyBlast extends CardImpl { new LockedInCondition(FerociousCondition.instance)); effect.setText("
Ferocious — If you control a creature with power 4 or greater, those creatures don't untap during their controllers' next untap steps"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().setTargetAdjuster(IcyBlastAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addHint(FerociousHint.instance); } @@ -47,13 +46,3 @@ public final class IcyBlast extends CardImpl { return new IcyBlast(this); } } - -enum IcyBlastAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX())); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/i/IllithidHarvester.java b/Mage.Sets/src/mage/cards/i/IllithidHarvester.java index fb6c3d95f54..3819725e282 100644 --- a/Mage.Sets/src/mage/cards/i/IllithidHarvester.java +++ b/Mage.Sets/src/mage/cards/i/IllithidHarvester.java @@ -24,7 +24,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.Target; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.Arrays; import java.util.UUID; @@ -59,7 +59,7 @@ public final class IllithidHarvester extends AdventureCard { this.getSpellCard().getSpellAbility().addEffect(new DontUntapInControllersNextUntapStepTargetEffect() .setText("They don't untap during their controllers' next untap steps")); this.getSpellCard().getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellCard().getSpellAbility().setTargetAdjuster(IllithidHarvesterAdjuster.instance); + this.getSpellCard().getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); this.finalizeAdventure(); } @@ -74,17 +74,6 @@ public final class IllithidHarvester extends AdventureCard { } } -enum IllithidHarvesterAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - ability.addTarget(new TargetCreaturePermanent(xValue, xValue)); - } -} - class IllithidHarvesterEffect extends OneShotEffect { IllithidHarvesterEffect() { diff --git a/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java b/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java index 3122b061b69..846c0db65be 100644 --- a/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java +++ b/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java @@ -7,14 +7,13 @@ import mage.cards.*; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterPermanent; -import mage.filter.predicate.Predicates; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Library; import mage.players.Player; import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.ArrayList; import java.util.List; @@ -31,7 +30,8 @@ public final class IndomitableCreativity extends CardImpl { // Destroy X target artifacts and/or creatures. For each permanent destroyed this way, its controller reveals cards from the top of their library until an artifact or creature card is revealed and exiles that card. Those players put the exiled card onto the battlefield, then shuffle their libraries. this.getSpellAbility().addEffect(new IndomitableCreativityEffect()); - this.getSpellAbility().setTargetAdjuster(IndomitableCreativityAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_CREATURE)); } private IndomitableCreativity(final IndomitableCreativity card) { @@ -44,25 +44,6 @@ public final class IndomitableCreativity extends CardImpl { } } -enum IndomitableCreativityAdjuster implements TargetAdjuster { - instance; - private static final FilterPermanent filter = new FilterPermanent("artifacts and/or creatures"); - - static { - filter.add(Predicates.or( - CardType.ARTIFACT.getPredicate(), - CardType.CREATURE.getPredicate() - )); - } - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - ability.addTarget(new TargetPermanent(xValue, xValue, filter, false)); - } -} - class IndomitableCreativityEffect extends OneShotEffect { IndomitableCreativityEffect() { diff --git a/Mage.Sets/src/mage/cards/k/KaerveksPurge.java b/Mage.Sets/src/mage/cards/k/KaerveksPurge.java index 4fe35c6ca5d..3cca29c6f7e 100644 --- a/Mage.Sets/src/mage/cards/k/KaerveksPurge.java +++ b/Mage.Sets/src/mage/cards/k/KaerveksPurge.java @@ -5,16 +5,13 @@ import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -28,7 +25,8 @@ public final class KaerveksPurge extends CardImpl { // Destroy target creature with converted mana cost X. If that creature dies this way, Kaervek's Purge deals damage equal to the creature's power to the creature's controller. this.getSpellAbility().addEffect(new KaerveksPurgeEffect()); - this.getSpellAbility().setTargetAdjuster(KaerveksPurgeAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private KaerveksPurge(final KaerveksPurge card) { @@ -41,19 +39,6 @@ public final class KaerveksPurge extends CardImpl { } } -enum KaerveksPurgeAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with mana value " + xValue); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.addTarget(new TargetCreaturePermanent(filter)); - } -} - class KaerveksPurgeEffect extends OneShotEffect { KaerveksPurgeEffect() { diff --git a/Mage.Sets/src/mage/cards/k/KillingGlare.java b/Mage.Sets/src/mage/cards/k/KillingGlare.java index 001f8c96f06..873d6f78e58 100644 --- a/Mage.Sets/src/mage/cards/k/KillingGlare.java +++ b/Mage.Sets/src/mage/cards/k/KillingGlare.java @@ -1,17 +1,13 @@ package mage.cards.k; -import mage.abilities.Ability; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.PowerPredicate; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.PowerTargetAdjuster; import java.util.UUID; @@ -25,7 +21,8 @@ public final class KillingGlare extends CardImpl { // Destroy target creature with power X or less. this.getSpellAbility().addEffect(new DestroyTargetEffect("destroy target creature with power X or less")); - this.getSpellAbility().setTargetAdjuster(KillingGlareAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private KillingGlare(final KillingGlare card) { @@ -37,16 +34,3 @@ public final class KillingGlare extends CardImpl { return new KillingGlare(this); } } - -enum KillingGlareAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - ability.getTargets().clear(); - FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power " + xValue + " or less"); - filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.addTarget(new TargetCreaturePermanent(filter)); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/l/LazavTheMultifarious.java b/Mage.Sets/src/mage/cards/l/LazavTheMultifarious.java index cc44a44c7e8..75be07827f7 100644 --- a/Mage.Sets/src/mage/cards/l/LazavTheMultifarious.java +++ b/Mage.Sets/src/mage/cards/l/LazavTheMultifarious.java @@ -1,6 +1,5 @@ package mage.cards.l; -import java.util.UUID; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; @@ -11,27 +10,21 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CopyEffect; import mage.abilities.effects.keyword.SurveilEffect; import mage.cards.Card; -import mage.constants.SubType; -import mage.constants.SuperType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.ComparisonType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.filter.FilterCard; -import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.constants.*; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentCard; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import mage.util.functions.CopyApplier; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class LazavTheMultifarious extends CardImpl { @@ -54,7 +47,8 @@ public final class LazavTheMultifarious extends CardImpl { new LazavTheMultifariousEffect(), new ManaCostsImpl<>("{X}") ); - ability.setTargetAdjuster(LazavTheMultifariousAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster()); + ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); this.addAbility(ability); } @@ -68,19 +62,6 @@ public final class LazavTheMultifarious extends CardImpl { } } -enum LazavTheMultifariousAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - FilterCard filterCard = new FilterCreatureCard("creature card with mana value " + xValue + " in your graveyard"); - filterCard.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.getTargets().clear(); - ability.getTargets().add(new TargetCardInYourGraveyard(filterCard)); - } -} - class LazavTheMultifariousEffect extends OneShotEffect { LazavTheMultifariousEffect() { @@ -134,7 +115,8 @@ class LazavTheMultifariousCopyApplier extends CopyApplier { new LazavTheMultifariousEffect(), new ManaCostsImpl<>("{X}") ); - ability.setTargetAdjuster(LazavTheMultifariousAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster()); + ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); blueprint.getAbilities().add(ability); blueprint.setName("Lazav, the Multifarious"); blueprint.addSuperType(SuperType.LEGENDARY); diff --git a/Mage.Sets/src/mage/cards/l/LeagueGuildmage.java b/Mage.Sets/src/mage/cards/l/LeagueGuildmage.java index f207e847d6c..67cb99ea095 100644 --- a/Mage.Sets/src/mage/cards/l/LeagueGuildmage.java +++ b/Mage.Sets/src/mage/cards/l/LeagueGuildmage.java @@ -1,6 +1,5 @@ package mage.cards.l; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -8,18 +7,17 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.CopyTargetSpellEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; +import mage.constants.SubType; import mage.constants.TargetController; import mage.filter.FilterSpell; import mage.filter.common.FilterInstantOrSorcerySpell; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; import mage.target.TargetSpell; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; + +import java.util.UUID; /** * @@ -56,7 +54,7 @@ public final class LeagueGuildmage extends CardImpl { ); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetSpell(filter)); - ability.setTargetAdjuster(LeagueGuildmageAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster()); this.addAbility(ability); } @@ -69,17 +67,3 @@ public final class LeagueGuildmage extends CardImpl { return new LeagueGuildmage(this); } } - -enum LeagueGuildmageAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - FilterSpell spellFilter = new FilterInstantOrSorcerySpell("instant or sorcery you control with mana value " + xValue); - spellFilter.add(TargetController.YOU.getControllerPredicate()); - spellFilter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.getTargets().clear(); - ability.addTarget(new TargetSpell(spellFilter)); - } -} diff --git a/Mage.Sets/src/mage/cards/l/LegacysAllure.java b/Mage.Sets/src/mage/cards/l/LegacysAllure.java index a1716ca4b47..8bde6218faf 100644 --- a/Mage.Sets/src/mage/cards/l/LegacysAllure.java +++ b/Mage.Sets/src/mage/cards/l/LegacysAllure.java @@ -1,26 +1,21 @@ package mage.cards.l; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.dynamicvalue.common.CountersSourceCount; import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.ComparisonType; -import mage.constants.Duration; -import mage.constants.TargetController; -import mage.constants.Zone; +import mage.constants.*; import mage.counters.CounterType; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.PowerPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.PowerTargetAdjuster; + +import java.util.UUID; /** * @author LevelX2 @@ -38,8 +33,8 @@ public final class LegacysAllure extends CardImpl { // Sacrifice Legacy's Allure: Gain control of target creature with power less than or equal to the number of treasure counters on Legacy's Allure. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainControlTargetEffect(Duration.EndOfGame, true), new SacrificeSourceCost()); - ability.addTarget(new TargetCreaturePermanent(0, 0, filter, false)); - ability.setTargetAdjuster(LegacysAllureAdjuster.instance); + ability.addTarget(new TargetCreaturePermanent(filter)); + ability.setTargetAdjuster(new PowerTargetAdjuster(new CountersSourceCount(CounterType.TREASURE), ComparisonType.OR_LESS)); this.addAbility(ability); } @@ -52,19 +47,3 @@ public final class LegacysAllure extends CardImpl { return new LegacysAllure(this); } } - -enum LegacysAllureAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(ability.getSourceId()); - if (sourcePermanent != null) { - int xValue = sourcePermanent.getCounters(game).getCount(CounterType.TREASURE); - FilterCreaturePermanent filter2 = new FilterCreaturePermanent("creature with power less than or equal to " + xValue); - filter2.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.getTargets().clear(); - ability.getTargets().add(new TargetCreaturePermanent(filter2)); - } - } -} diff --git a/Mage.Sets/src/mage/cards/l/LikenessLooter.java b/Mage.Sets/src/mage/cards/l/LikenessLooter.java index fd91545c71b..2cdd846ac7e 100644 --- a/Mage.Sets/src/mage/cards/l/LikenessLooter.java +++ b/Mage.Sets/src/mage/cards/l/LikenessLooter.java @@ -15,15 +15,13 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.FilterCard; -import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentCard; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import mage.util.functions.CopyApplier; import java.util.UUID; @@ -52,7 +50,8 @@ public final class LikenessLooter extends CardImpl { new LikenessLooterEffect(), new ManaCostsImpl<>("{X}") ); - ability.setTargetAdjuster(LikenessLooterAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster()); + ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); this.addAbility(ability); } @@ -66,19 +65,6 @@ public final class LikenessLooter extends CardImpl { } } -enum LikenessLooterAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - FilterCard filterCard = new FilterCreatureCard("creature card in your graveyard with mana value " + xValue); - filterCard.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.getTargets().clear(); - ability.getTargets().add(new TargetCardInYourGraveyard(filterCard)); - } -} - class LikenessLooterEffect extends OneShotEffect { LikenessLooterEffect() { @@ -130,7 +116,8 @@ class LikenessLooterCopyApplier extends CopyApplier { new LikenessLooterEffect(), new ManaCostsImpl<>("{X}") ); - ability.setTargetAdjuster(LikenessLooterAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster()); + ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); blueprint.getAbilities().add(ability); return true; } diff --git a/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java b/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java index 009ae8730b6..cefbd5b0def 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java +++ b/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java @@ -2,25 +2,19 @@ package mage.cards.l; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.costs.Cost; -import mage.abilities.costs.common.PayVariableLoyaltyCost; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.abilities.effects.common.discard.DiscardEachPlayerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.SubType; import mage.constants.SuperType; -import mage.filter.FilterCard; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; import mage.game.command.emblems.LilianaDefiantNecromancerEmblem; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -51,7 +45,7 @@ public final class LilianaDefiantNecromancer extends CardImpl { // -X: Return target nonlegendary creature with converted mana cost X from your graveyard to the battlefield. Ability ability = new LoyaltyAbility(new ReturnFromGraveyardToBattlefieldTargetEffect()); ability.addTarget(new TargetCardInYourGraveyard(filter)); - ability.setTargetAdjuster(LilianaDefiantNecromancerAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster()); this.addAbility(ability); //-8: You get an emblem with "Whenever a creature dies, return it to the battlefield under your control at the beginning of the next end step."; @@ -67,21 +61,3 @@ public final class LilianaDefiantNecromancer extends CardImpl { return new LilianaDefiantNecromancer(this); } } - -enum LilianaDefiantNecromancerAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int cmc = 0; - for (Cost cost : ability.getCosts()) { - if (cost instanceof PayVariableLoyaltyCost) { - cmc = ((PayVariableLoyaltyCost) cost).getAmount(); - } - } - FilterCard newFilter = LilianaDefiantNecromancer.filter.copy(); - newFilter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, cmc)); - ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard(newFilter)); - } -} diff --git a/Mage.Sets/src/mage/cards/l/LinessaZephyrMage.java b/Mage.Sets/src/mage/cards/l/LinessaZephyrMage.java index 2f974b18a1b..57e56d2e9d7 100644 --- a/Mage.Sets/src/mage/cards/l/LinessaZephyrMage.java +++ b/Mage.Sets/src/mage/cards/l/LinessaZephyrMage.java @@ -1,6 +1,5 @@ package mage.cards.l; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.abilityword.GrandeurAbility; @@ -11,11 +10,7 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Outcome; -import mage.constants.SuperType; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; import mage.game.Game; @@ -26,7 +21,9 @@ import mage.target.TargetPermanent; import mage.target.TargetPlayer; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetControlledPermanent; -import mage.target.targetadjustment.XCMCPermanentAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; + +import java.util.UUID; /** * @@ -53,7 +50,7 @@ public final class LinessaZephyrMage extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new ManaCostsImpl<>("{X}{U}{U}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(XCMCPermanentAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster()); this.addAbility(ability); // Grandeur - Discard another card named Linessa, Zephyr Mage: Target player returns a creature they control to its owner's hand, then repeats this process for an artifact, an enchantment, and a land. diff --git a/Mage.Sets/src/mage/cards/l/LostInTheMaze.java b/Mage.Sets/src/mage/cards/l/LostInTheMaze.java index 8f5a42d2d16..1c6dd9a01d9 100644 --- a/Mage.Sets/src/mage/cards/l/LostInTheMaze.java +++ b/Mage.Sets/src/mage/cards/l/LostInTheMaze.java @@ -3,7 +3,6 @@ package mage.cards.l; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.TapTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; @@ -21,7 +20,7 @@ import mage.filter.predicate.permanent.TappedPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -45,7 +44,8 @@ public final class LostInTheMaze extends CardImpl { // When Lost in the Maze enters the battlefield, tap X target creatures. Put a stun counter on each of those creatures you don't control. Ability ability = new EntersBattlefieldTriggeredAbility(new TapTargetEffect("tap X target creatures")); ability.addEffect(new LostInTheMazeEffect()); - ability.setTargetAdjuster(LostInTheMazeAdjuster.instance); + ability.setTargetAdjuster(new XTargetsCountAdjuster()); + ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); // Tapped creatures you control have hexproof. @@ -64,16 +64,6 @@ public final class LostInTheMaze extends CardImpl { } } -enum LostInTheMazeAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(ManacostVariableValue.ETB.calculate(game, ability, null))); - } -} - class LostInTheMazeEffect extends OneShotEffect { LostInTheMazeEffect() { diff --git a/Mage.Sets/src/mage/cards/l/LullmagesDomination.java b/Mage.Sets/src/mage/cards/l/LullmagesDomination.java index 338e184b031..a176e9d667a 100644 --- a/Mage.Sets/src/mage/cards/l/LullmagesDomination.java +++ b/Mage.Sets/src/mage/cards/l/LullmagesDomination.java @@ -1,6 +1,5 @@ package mage.cards.l; -import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.SourceTargetsPermanentCondition; @@ -9,18 +8,16 @@ import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.Duration; import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicate; -import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -50,7 +47,8 @@ public final class LullmagesDomination extends CardImpl { // Gain control of target creature with converted mana cost X. this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.Custom) .setText("gain control of target creature with mana value X")); - this.getSpellAbility().setTargetAdjuster(LullmagesDominationAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private LullmagesDomination(final LullmagesDomination card) { @@ -72,16 +70,3 @@ enum LullmagesDominationPredicate implements Predicate { return player != null && player.getGraveyard().size() >= 8; } } - -enum LullmagesDominationAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with mana value " + xValue); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.addTarget(new TargetCreaturePermanent(filter)); - } -} diff --git a/Mage.Sets/src/mage/cards/m/MagusOfTheCandelabra.java b/Mage.Sets/src/mage/cards/m/MagusOfTheCandelabra.java index 04c5f32b787..b02aa1e1377 100644 --- a/Mage.Sets/src/mage/cards/m/MagusOfTheCandelabra.java +++ b/Mage.Sets/src/mage/cards/m/MagusOfTheCandelabra.java @@ -1,6 +1,5 @@ package mage.cards.m; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -15,7 +14,9 @@ import mage.constants.SubType; import mage.constants.Zone; import mage.filter.StaticFilters; import mage.target.TargetPermanent; -import mage.target.targetadjustment.XTargetsAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; + +import java.util.UUID; /** * @author duncant @@ -36,7 +37,7 @@ public final class MagusOfTheCandelabra extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{X}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS)); - ability.setTargetAdjuster(XTargetsAdjuster.instance); + ability.setTargetAdjuster(new XTargetsCountAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java b/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java index a222baacb1d..61d2e7bc30f 100644 --- a/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java +++ b/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java @@ -1,7 +1,6 @@ package mage.cards.m; -import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; @@ -11,9 +10,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; -import mage.game.Game; import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -22,6 +20,16 @@ import java.util.UUID; */ public final class MaliciousAdvice extends CardImpl { + private static final FilterPermanent filter = new FilterPermanent("artifacts, creatures, and/or lands"); + + static { + filter.add(Predicates.or( + CardType.ARTIFACT.getPredicate(), + CardType.CREATURE.getPredicate(), + CardType.LAND.getPredicate() + )); + } + public MaliciousAdvice(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}{B}"); @@ -30,7 +38,8 @@ public final class MaliciousAdvice extends CardImpl { effect.setText("Tap X target artifacts, creatures, and/or lands"); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(ManacostVariableValue.REGULAR)); - this.getSpellAbility().setTargetAdjuster(MaliciousAdviceAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); } private MaliciousAdvice(final MaliciousAdvice card) { @@ -42,22 +51,3 @@ public final class MaliciousAdvice extends CardImpl { return new MaliciousAdvice(this); } } - -enum MaliciousAdviceAdjuster implements TargetAdjuster { - instance; - private static final FilterPermanent filter = new FilterPermanent("artifacts, creatures, and/or lands"); - - static { - filter.add(Predicates.or( - CardType.ARTIFACT.getPredicate(), - CardType.CREATURE.getPredicate(), - CardType.LAND.getPredicate() - )); - } - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(ability.getManaCostsToPay().getX(), filter)); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/m/MarchOfBurgeoningLife.java b/Mage.Sets/src/mage/cards/m/MarchOfBurgeoningLife.java index 784a9948af4..300363227da 100644 --- a/Mage.Sets/src/mage/cards/m/MarchOfBurgeoningLife.java +++ b/Mage.Sets/src/mage/cards/m/MarchOfBurgeoningLife.java @@ -12,18 +12,15 @@ import mage.constants.ComparisonType; import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.FilterCard; -import mage.filter.FilterPermanent; import mage.filter.common.FilterCreatureCard; -import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicate; import mage.filter.predicate.mageobject.ColorPredicate; -import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.TargetPermanent; import mage.target.common.TargetCardInLibrary; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import mage.util.CardUtil; import java.util.UUID; @@ -47,7 +44,8 @@ public final class MarchOfBurgeoningLife extends CardImpl { // Choose target creature with mana value less than X. Search your library for a creature card with the same name as that creature, put it onto the battlefield tapped, then shuffle. this.getSpellAbility().addEffect(new MarchOfBurgeoningLifeEffect()); - this.getSpellAbility().setTargetAdjuster(MarchOfBurgeoningLifeAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.FEWER_THAN)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private MarchOfBurgeoningLife(final MarchOfBurgeoningLife card) { @@ -60,19 +58,6 @@ public final class MarchOfBurgeoningLife extends CardImpl { } } -enum MarchOfBurgeoningLifeAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - FilterPermanent filter = new FilterCreaturePermanent("creature with mana value less than " + xValue); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, xValue)); - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(filter)); - } -} - class MarchOfBurgeoningLifeEffect extends OneShotEffect { private static class MarchOfBurgeoningLifePredicate implements Predicate { diff --git a/Mage.Sets/src/mage/cards/m/MarchOfOtherworldlyLight.java b/Mage.Sets/src/mage/cards/m/MarchOfOtherworldlyLight.java index 5d4738b0380..f70266810d1 100644 --- a/Mage.Sets/src/mage/cards/m/MarchOfOtherworldlyLight.java +++ b/Mage.Sets/src/mage/cards/m/MarchOfOtherworldlyLight.java @@ -1,7 +1,6 @@ package mage.cards.m; import mage.ObjectColor; -import mage.abilities.Ability; import mage.abilities.costs.costadjusters.ExileCardsFromHandAdjuster; import mage.abilities.effects.common.ExileTargetEffect; import mage.cards.CardImpl; @@ -12,10 +11,8 @@ import mage.filter.FilterCard; import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -26,8 +23,15 @@ public final class MarchOfOtherworldlyLight extends CardImpl { private static final FilterCard filter = new FilterCard("white cards from your hand"); + private static final FilterPermanent filter2 = new FilterPermanent("artifact, creature, or enchantment"); + static { filter.add(new ColorPredicate(ObjectColor.WHITE)); + filter2.add(Predicates.or( + CardType.ARTIFACT.getPredicate(), + CardType.CREATURE.getPredicate(), + CardType.ENCHANTMENT.getPredicate() + )); } public MarchOfOtherworldlyLight(UUID ownerId, CardSetInfo setInfo) { @@ -40,7 +44,8 @@ public final class MarchOfOtherworldlyLight extends CardImpl { this.getSpellAbility().addEffect(new ExileTargetEffect( "exile target artifact, creature, or enchantment with mana value X or less" )); - this.getSpellAbility().setTargetAdjuster(MarchOfOtherworldlyLightAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.OR_LESS)); + this.getSpellAbility().addTarget(new TargetPermanent(filter2)); } private MarchOfOtherworldlyLight(final MarchOfOtherworldlyLight card) { @@ -52,23 +57,3 @@ public final class MarchOfOtherworldlyLight extends CardImpl { return new MarchOfOtherworldlyLight(this); } } - -enum MarchOfOtherworldlyLightAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - FilterPermanent filter = new FilterPermanent( - "artifact, creature, or enchantment with mana value " + xValue + " or less" - ); - filter.add(Predicates.or( - CardType.ARTIFACT.getPredicate(), - CardType.CREATURE.getPredicate(), - CardType.ENCHANTMENT.getPredicate() - )); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(filter)); - } -} diff --git a/Mage.Sets/src/mage/cards/m/MarchOfSwirlingMist.java b/Mage.Sets/src/mage/cards/m/MarchOfSwirlingMist.java index 0e96217d801..7c8f91949ac 100644 --- a/Mage.Sets/src/mage/cards/m/MarchOfSwirlingMist.java +++ b/Mage.Sets/src/mage/cards/m/MarchOfSwirlingMist.java @@ -1,7 +1,6 @@ package mage.cards.m; import mage.ObjectColor; -import mage.abilities.Ability; import mage.abilities.costs.costadjusters.ExileCardsFromHandAdjuster; import mage.abilities.effects.common.PhaseOutTargetEffect; import mage.cards.CardImpl; @@ -9,9 +8,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.ColorPredicate; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -34,7 +32,8 @@ public final class MarchOfSwirlingMist extends CardImpl { // Up to X target creatures phase out. this.getSpellAbility().addEffect(new PhaseOutTargetEffect().setText("up to X target creatures phase out")); - this.getSpellAbility().setTargetAdjuster(MarchOfSwirlingMistAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1)); } private MarchOfSwirlingMist(final MarchOfSwirlingMist card) { @@ -46,13 +45,3 @@ public final class MarchOfSwirlingMist extends CardImpl { return new MarchOfSwirlingMist(this); } } - -enum MarchOfSwirlingMistAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(0, ability.getManaCostsToPay().getX())); - } -} diff --git a/Mage.Sets/src/mage/cards/m/MarshalsAnthem.java b/Mage.Sets/src/mage/cards/m/MarshalsAnthem.java index aa7751f163b..671e26a2045 100644 --- a/Mage.Sets/src/mage/cards/m/MarshalsAnthem.java +++ b/Mage.Sets/src/mage/cards/m/MarshalsAnthem.java @@ -13,11 +13,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.filter.common.FilterCreatureCard; -import mage.game.Game; +import mage.filter.StaticFilters; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -44,7 +42,8 @@ public final class MarshalsAnthem extends CardImpl { Ability ability = new EntersBattlefieldTriggeredAbility( new ReturnFromGraveyardToBattlefieldTargetEffect().setText(rule), false ); - ability.setTargetAdjuster(MarshalsAnthemAdjuster.instance); + ability.setTargetAdjuster(new TargetsCountAdjuster(MultikickerCount.instance)); + ability.addTarget(new TargetCardInYourGraveyard(0, 1, StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); this.addAbility(ability); } @@ -57,17 +56,3 @@ public final class MarshalsAnthem extends CardImpl { return new MarshalsAnthem(this); } } - -enum MarshalsAnthemAdjuster implements TargetAdjuster { - instance; - private static final FilterCard filter = new FilterCreatureCard("creature card in your graveyard"); - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int numbTargets = MultikickerCount.instance.calculate(game, ability, null); - if (numbTargets > 0) { - ability.addTarget(new TargetCardInYourGraveyard(0, numbTargets, filter)); - } - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/m/MartyrOfBones.java b/Mage.Sets/src/mage/cards/m/MartyrOfBones.java index a9bd818f812..f2ce4b10120 100644 --- a/Mage.Sets/src/mage/cards/m/MartyrOfBones.java +++ b/Mage.Sets/src/mage/cards/m/MartyrOfBones.java @@ -5,7 +5,6 @@ import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.Cost; -import mage.abilities.costs.VariableCost; import mage.abilities.costs.VariableCostImpl; import mage.abilities.costs.VariableCostType; import mage.abilities.costs.common.RevealTargetFromHandCost; @@ -18,13 +17,12 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; import mage.filter.FilterCard; -import mage.filter.StaticFilters; import mage.filter.predicate.mageobject.ColorPredicate; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInASingleGraveyard; import mage.target.common.TargetCardInHand; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -45,8 +43,8 @@ public final class MartyrOfBones extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new GenericManaCost(1)); ability.addCost(new RevealVariableBlackCardsFromHandCost()); ability.addCost(new SacrificeSourceCost()); - ability.addTarget(new TargetCardInASingleGraveyard(0, 1, StaticFilters.FILTER_CARD_CARDS)); - ability.setTargetAdjuster(MartyrOfBonesAdjuster.instance); + ability.addTarget(new TargetCardInASingleGraveyard(0, 1, new FilterCard("up to X target cards"))); + ability.setTargetAdjuster(new XTargetsCountAdjuster()); this.addAbility(ability); } @@ -60,22 +58,6 @@ public final class MartyrOfBones extends CardImpl { } } -enum MartyrOfBonesAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int amount = 0; - for (Cost cost : ability.getCosts()) { - if (cost instanceof RevealVariableBlackCardsFromHandCost) { - amount = ((VariableCost) cost).getAmount(); - } - } - ability.getTargets().clear(); - ability.addTarget(new TargetCardInASingleGraveyard(0, amount, StaticFilters.FILTER_CARD_CARDS)); - } -} - class RevealVariableBlackCardsFromHandCost extends VariableCostImpl { private static final FilterCard filter = new FilterCard("X black cards from your hand"); diff --git a/Mage.Sets/src/mage/cards/m/MassManipulation.java b/Mage.Sets/src/mage/cards/m/MassManipulation.java index 61104d45bb0..b126ba4773e 100644 --- a/Mage.Sets/src/mage/cards/m/MassManipulation.java +++ b/Mage.Sets/src/mage/cards/m/MassManipulation.java @@ -1,14 +1,12 @@ package mage.cards.m; -import mage.abilities.Ability; import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.game.Game; import mage.target.common.TargetCreatureOrPlaneswalker; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -26,7 +24,7 @@ public final class MassManipulation extends CardImpl { .setText("Gain control of X target creatures and/or planeswalkers.") ); this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker()); - this.getSpellAbility().setTargetAdjuster(MassManipulationAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); } private MassManipulation(final MassManipulation card) { @@ -38,13 +36,3 @@ public final class MassManipulation extends CardImpl { return new MassManipulation(this); } } - -enum MassManipulationAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreatureOrPlaneswalker(ability.getManaCostsToPay().getX())); - } -} diff --git a/Mage.Sets/src/mage/cards/m/MeteorBlast.java b/Mage.Sets/src/mage/cards/m/MeteorBlast.java index c4d2ae42333..ed4dcbe40c6 100644 --- a/Mage.Sets/src/mage/cards/m/MeteorBlast.java +++ b/Mage.Sets/src/mage/cards/m/MeteorBlast.java @@ -1,13 +1,11 @@ package mage.cards.m; -import mage.abilities.Ability; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.game.Game; import mage.target.common.TargetAnyTarget; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -23,7 +21,8 @@ public final class MeteorBlast extends CardImpl { this.getSpellAbility().addEffect( new DamageTargetEffect(4).setText("{this} deals 4 damage to each of X targets") ); - this.getSpellAbility().setTargetAdjuster(MeteorBlastAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetAnyTarget()); } private MeteorBlast(final MeteorBlast card) { @@ -35,15 +34,3 @@ public final class MeteorBlast extends CardImpl { return new MeteorBlast(this); } } - -enum MeteorBlastAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - if (xValue > 0) { - ability.addTarget(new TargetAnyTarget(xValue)); - } - } -} diff --git a/Mage.Sets/src/mage/cards/m/MeteorSwarm.java b/Mage.Sets/src/mage/cards/m/MeteorSwarm.java index 320fa7d1636..6b3c7bb7c35 100644 --- a/Mage.Sets/src/mage/cards/m/MeteorSwarm.java +++ b/Mage.Sets/src/mage/cards/m/MeteorSwarm.java @@ -1,13 +1,11 @@ package mage.cards.m; -import mage.abilities.Ability; import mage.abilities.effects.common.DamageMultiEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.game.Game; import mage.target.common.TargetCreatureOrPlaneswalkerAmount; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -25,7 +23,7 @@ public final class MeteorSwarm extends CardImpl { setText("{this} deals 8 damage divided as you choose among X target creatures and/or planeswalkers.") ); this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalkerAmount(8)); - this.getSpellAbility().setTargetAdjuster(MeteorSwarmAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); } private MeteorSwarm(final MeteorSwarm card) { @@ -37,20 +35,3 @@ public final class MeteorSwarm extends CardImpl { return new MeteorSwarm(this); } } - -enum MeteorSwarmAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xManaSpent = ability.getManaCostsToPay().getX(); - if(xManaSpent != 0) { - TargetCreatureOrPlaneswalkerAmount targetCreatureOrPlaneswalkerAmount = new TargetCreatureOrPlaneswalkerAmount(8); - targetCreatureOrPlaneswalkerAmount.setMinNumberOfTargets(xManaSpent); - targetCreatureOrPlaneswalkerAmount.setMaxNumberOfTargets(xManaSpent); - ability.addTarget(targetCreatureOrPlaneswalkerAmount); - } - } -} - diff --git a/Mage.Sets/src/mage/cards/m/MidnightArsonist.java b/Mage.Sets/src/mage/cards/m/MidnightArsonist.java index 358caa60f97..4f83c5592a0 100644 --- a/Mage.Sets/src/mage/cards/m/MidnightArsonist.java +++ b/Mage.Sets/src/mage/cards/m/MidnightArsonist.java @@ -5,7 +5,6 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.DestroyTargetEffect; -import mage.abilities.hint.Hint; import mage.abilities.hint.ValueHint; import mage.abilities.mana.ManaAbility; import mage.cards.CardImpl; @@ -19,7 +18,7 @@ import mage.filter.predicate.Predicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -28,6 +27,13 @@ import java.util.UUID; */ public final class MidnightArsonist extends CardImpl { + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.VAMPIRE); + private static final FilterPermanent filter2 = new FilterArtifactPermanent("artifacts without mana abilities"); + + static { + filter2.add(MidnightArsonistPredicate.instance); + } + public MidnightArsonist(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); @@ -38,8 +44,10 @@ public final class MidnightArsonist extends CardImpl { // When Midnight Arsonist enters the battlefield, destroy up to X target artifacts without mana abilities, where X is the number of Vampires you control. Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect() .setText("destroy up to X target artifacts without mana abilities, where X is the number of Vampires you control")); - ability.setTargetAdjuster(MidnightArsonistAdjuster.instance); - this.addAbility(ability.addHint(MidnightArsonistAdjuster.getHint())); + ability.setTargetAdjuster(new TargetsCountAdjuster(new PermanentsOnBattlefieldCount(filter))); + ability.addTarget(new TargetPermanent(0, 1, filter2)); + ability.addHint(new ValueHint("Vampires you control", new PermanentsOnBattlefieldCount(filter))); + this.addAbility(ability); } private MidnightArsonist(final MidnightArsonist card) { @@ -52,29 +60,6 @@ public final class MidnightArsonist extends CardImpl { } } -enum MidnightArsonistAdjuster implements TargetAdjuster { - instance; - private static final FilterPermanent filter = new FilterControlledPermanent(SubType.VAMPIRE); - private static final FilterPermanent filter2 = new FilterArtifactPermanent("artifacts without mana abilities"); - - static { - filter2.add(MidnightArsonistPredicate.instance); - } - - private static final Hint hint = new ValueHint("Vampires you control", new PermanentsOnBattlefieldCount(filter)); - - @Override - public void adjustTargets(Ability ability, Game game) { - int vampires = game.getBattlefield().count(filter, ability.getControllerId(), ability, game); - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(0, vampires, filter2)); - } - - public static Hint getHint() { - return hint; - } -} - enum MidnightArsonistPredicate implements Predicate { instance; diff --git a/Mage.Sets/src/mage/cards/m/MidnightRitual.java b/Mage.Sets/src/mage/cards/m/MidnightRitual.java index f314dee05ab..bf17fdafbc1 100644 --- a/Mage.Sets/src/mage/cards/m/MidnightRitual.java +++ b/Mage.Sets/src/mage/cards/m/MidnightRitual.java @@ -15,7 +15,7 @@ import mage.game.Game; import mage.game.permanent.token.ZombieToken; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -31,7 +31,7 @@ public final class MidnightRitual extends CardImpl { // For each creature card exiled this way, create a 2/2 black Zombie creature token. this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); this.getSpellAbility().addEffect(new MidnightRitualEffect()); - this.getSpellAbility().setTargetAdjuster(MidnightRitualAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); } private MidnightRitual(final MidnightRitual card) { @@ -44,16 +44,6 @@ public final class MidnightRitual extends CardImpl { } } -enum MidnightRitualAdjuster 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)); - } -} - class MidnightRitualEffect extends OneShotEffect { MidnightRitualEffect() { diff --git a/Mage.Sets/src/mage/cards/m/MinamoSightbender.java b/Mage.Sets/src/mage/cards/m/MinamoSightbender.java index 5c4a8ecb380..5dd07b849f8 100644 --- a/Mage.Sets/src/mage/cards/m/MinamoSightbender.java +++ b/Mage.Sets/src/mage/cards/m/MinamoSightbender.java @@ -1,6 +1,5 @@ package mage.cards.m; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -13,13 +12,11 @@ import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.PowerPredicate; -import mage.game.Game; -import mage.target.Target; -import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetadjustment.PowerTargetAdjuster; + +import java.util.UUID; /** * @@ -27,11 +24,7 @@ import mage.target.targetadjustment.TargetAdjuster; */ public final class MinamoSightbender extends CardImpl { - private static final FilterPermanent filter = new FilterPermanent("creature with power X or less"); - - static { - filter.add(CardType.CREATURE.getPredicate()); - } + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power X or less"); public MinamoSightbender(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); @@ -43,9 +36,8 @@ public final class MinamoSightbender extends CardImpl { // {X}, {T}: Target creature with power X or less can't be blocked this turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBeBlockedTargetEffect(), new ManaCostsImpl<>("{X}")); - Target target = new TargetPermanent(filter); - ability.setTargetAdjuster(MinamoSightbenderAdjuster.instance); - ability.addTarget(target); + ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS)); + ability.addTarget(new TargetCreaturePermanent(filter)); ability.addCost(new TapSourceCost()); this.addAbility(ability); @@ -60,16 +52,3 @@ public final class MinamoSightbender extends CardImpl { return new MinamoSightbender(this); } } - -enum MinamoSightbenderAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - FilterPermanent permanentFilter = new FilterCreaturePermanent("creature with power " + xValue + " or less"); - permanentFilter.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.getTargets().clear(); - ability.getTargets().add(new TargetPermanent(permanentFilter)); - } -} diff --git a/Mage.Sets/src/mage/cards/m/MishrasHelix.java b/Mage.Sets/src/mage/cards/m/MishrasHelix.java index b90bbac7c0f..2b4d89721f6 100644 --- a/Mage.Sets/src/mage/cards/m/MishrasHelix.java +++ b/Mage.Sets/src/mage/cards/m/MishrasHelix.java @@ -1,6 +1,5 @@ package mage.cards.m; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; @@ -13,7 +12,9 @@ import mage.constants.CardType; import mage.constants.Zone; import mage.filter.StaticFilters; import mage.target.TargetPermanent; -import mage.target.targetadjustment.XTargetsAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; + +import java.util.UUID; /** * @@ -29,7 +30,7 @@ public final class MishrasHelix extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{X}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS)); - ability.setTargetAdjuster(XTargetsAdjuster.instance); + ability.setTargetAdjuster(new XTargetsCountAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/m/MogissMarauder.java b/Mage.Sets/src/mage/cards/m/MogissMarauder.java index fd64155517d..8167a6ca2cb 100644 --- a/Mage.Sets/src/mage/cards/m/MogissMarauder.java +++ b/Mage.Sets/src/mage/cards/m/MogissMarauder.java @@ -12,9 +12,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -42,7 +41,8 @@ public final class MogissMarauder extends CardImpl { HasteAbility.getInstance(), Duration.EndOfTurn, "and haste until end of turn, where X is your devotion to black" )); - ability.setTargetAdjuster(MogissMarauderAdjuster.instance); + ability.setTargetAdjuster(new TargetsCountAdjuster(DevotionCount.B)); + ability.addTarget(new TargetCreaturePermanent(0, 1)); ability.addHint(DevotionCount.B.getHint()); this.addAbility(ability); } @@ -56,16 +56,3 @@ public final class MogissMarauder extends CardImpl { return new MogissMarauder(this); } } - -enum MogissMarauderAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int numbTargets = DevotionCount.B.calculate(game, ability, null); - if (numbTargets > 0) { - ability.addTarget(new TargetCreaturePermanent(0, numbTargets)); - } - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/m/Molder.java b/Mage.Sets/src/mage/cards/m/Molder.java index 0a41990d806..282769b7a3a 100644 --- a/Mage.Sets/src/mage/cards/m/Molder.java +++ b/Mage.Sets/src/mage/cards/m/Molder.java @@ -1,20 +1,15 @@ package mage.cards.m; -import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; -import mage.filter.FilterPermanent; -import mage.filter.common.FilterArtifactOrEnchantmentPermanent; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; +import mage.filter.StaticFilters; import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -29,7 +24,8 @@ public final class Molder extends CardImpl { // Destroy target artifact or enchantment with converted mana cost X. It can't be regenerated. You gain X life. this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy target artifact or enchantment with mana value X. It can't be regenerated", true)); this.getSpellAbility().addEffect(new GainLifeEffect(ManacostVariableValue.REGULAR)); - this.getSpellAbility().setTargetAdjuster(MolderAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster()); + this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT)); } private Molder(final Molder card) { @@ -41,16 +37,3 @@ public final class Molder extends CardImpl { return new Molder(this); } } - -enum MolderAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - FilterPermanent filter = new FilterArtifactOrEnchantmentPermanent("artifact or enchantment with mana value " + xValue); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.addTarget(new TargetPermanent(filter)); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/n/NahirisWrath.java b/Mage.Sets/src/mage/cards/n/NahirisWrath.java index eae4f92b511..253781c8899 100644 --- a/Mage.Sets/src/mage/cards/n/NahirisWrath.java +++ b/Mage.Sets/src/mage/cards/n/NahirisWrath.java @@ -1,7 +1,5 @@ package mage.cards.n; -import mage.abilities.Ability; -import mage.abilities.costs.VariableCost; import mage.abilities.costs.common.DiscardXTargetCost; import mage.abilities.dynamicvalue.common.DiscardCostCardManaValue; import mage.abilities.effects.Effect; @@ -10,10 +8,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.FilterCard; -import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent; -import mage.game.Game; import mage.target.common.TargetCreatureOrPlaneswalker; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -32,7 +28,8 @@ public final class NahirisWrath extends CardImpl { Effect effect = new DamageTargetEffect(DiscardCostCardManaValue.instance); effect.setText("{this} deals damage equal to the total mana value of the discarded cards to each of up to X target creatures and/or planeswalkers"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().setTargetAdjuster(NahirisWrathAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker(0, 1)); } private NahirisWrath(final NahirisWrath card) { @@ -44,22 +41,3 @@ public final class NahirisWrath extends CardImpl { return new NahirisWrath(this); } } - -enum NahirisWrathAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int numTargets = 0; - for (VariableCost cost : ability.getCosts().getVariableCosts()) { - if (cost instanceof DiscardXTargetCost) { - numTargets = cost.getAmount(); - break; - } - } - if (numTargets > 0) { - ability.addTarget(new TargetCreatureOrPlaneswalker(0, numTargets, new FilterCreatureOrPlaneswalkerPermanent(), false)); - } - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/n/NostalgicDreams.java b/Mage.Sets/src/mage/cards/n/NostalgicDreams.java index 695230231fc..12183b242c9 100644 --- a/Mage.Sets/src/mage/cards/n/NostalgicDreams.java +++ b/Mage.Sets/src/mage/cards/n/NostalgicDreams.java @@ -1,8 +1,6 @@ package mage.cards.n; -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.ExileSpellEffect; import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; @@ -11,9 +9,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.FilterCard; import mage.filter.StaticFilters; -import mage.game.Game; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -32,7 +29,8 @@ public final class NostalgicDreams extends CardImpl { Effect effect = new ReturnFromGraveyardToHandTargetEffect(); effect.setText("Return X target cards from your graveyard to your hand"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().setTargetAdjuster(NostalgicDreamsAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_FROM_YOUR_GRAVEYARD)); // Exile Nostalgic Dreams. this.getSpellAbility().addEffect(new ExileSpellEffect()); @@ -47,16 +45,3 @@ public final class NostalgicDreams extends CardImpl { return new NostalgicDreams(this); } } - -enum NostalgicDreamsAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard( - GetXValue.instance.calculate(game, ability, null), - StaticFilters.FILTER_CARD_FROM_YOUR_GRAVEYARD - )); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/o/OpenIntoWonder.java b/Mage.Sets/src/mage/cards/o/OpenIntoWonder.java index e65612df3e9..0350f512842 100644 --- a/Mage.Sets/src/mage/cards/o/OpenIntoWonder.java +++ b/Mage.Sets/src/mage/cards/o/OpenIntoWonder.java @@ -11,9 +11,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -32,7 +31,8 @@ public final class OpenIntoWonder extends CardImpl { Ability abilityToGain = new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1), false); this.getSpellAbility().addEffect(new GainAbilityTargetEffect(abilityToGain, Duration.EndOfTurn, "Until end of turn, those creatures gain \"Whenever this creature deals combat damage to a player, draw a card.\"")); - this.getSpellAbility().setTargetAdjuster(OpenIntoWonderAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private OpenIntoWonder(final OpenIntoWonder card) { @@ -44,13 +44,3 @@ public final class OpenIntoWonder extends CardImpl { return new OpenIntoWonder(this); } } - -enum OpenIntoWonderAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX())); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/o/OpenSeason.java b/Mage.Sets/src/mage/cards/o/OpenSeason.java index 863f3331a6c..9a6316526d3 100644 --- a/Mage.Sets/src/mage/cards/o/OpenSeason.java +++ b/Mage.Sets/src/mage/cards/o/OpenSeason.java @@ -15,12 +15,11 @@ import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetadjustment.EachOpponentPermanentTargetsAdjuster; import java.util.UUID; @@ -36,7 +35,8 @@ public final class OpenSeason extends CardImpl { Effect effect = new AddCountersTargetEffect(CounterType.BOUNTY.createInstance()); effect.setText("for each opponent, put a bounty counter on target creature that player controls"); Ability ability = new EntersBattlefieldTriggeredAbility(effect); - ability.setTargetAdjuster(OpenSeasonAdjuster.instance); + ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster()); + ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); // Creatures your opponent control with bounty counters on them can't activate abilities @@ -57,21 +57,6 @@ public final class OpenSeason extends CardImpl { } } -enum OpenSeasonAdjuster 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) { - ability.addTarget(new TargetPermanent(new FilterCreaturePermanent("creature from opponent " + opponent.getLogName()))); - } - } - } -} - class OpenSeasonRestrictionEffect extends RestrictionEffect { OpenSeasonRestrictionEffect() { diff --git a/Mage.Sets/src/mage/cards/o/Outmaneuver.java b/Mage.Sets/src/mage/cards/o/Outmaneuver.java index d3c5f503a33..8fc92535bad 100644 --- a/Mage.Sets/src/mage/cards/o/Outmaneuver.java +++ b/Mage.Sets/src/mage/cards/o/Outmaneuver.java @@ -11,10 +11,8 @@ import mage.constants.Outcome; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.BlockedPredicate; import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -22,13 +20,19 @@ import java.util.UUID; * @author jeffwadsworth */ public final class Outmaneuver extends CardImpl { + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + + static { + filter.add(BlockedPredicate.instance); + } public Outmaneuver(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{R}"); // X target blocked creatures assign their combat damage this turn as though they weren't blocked. this.getSpellAbility().addEffect(new OutmaneuverEffect()); - this.getSpellAbility().setTargetAdjuster(OutmaneuverAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); } private Outmaneuver(final Outmaneuver card) { @@ -41,22 +45,6 @@ public final class Outmaneuver extends CardImpl { } } -enum OutmaneuverAdjuster implements TargetAdjuster { - instance; - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); - - static { - filter.add(BlockedPredicate.instance); - } - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int numberOfTargets = ability.getManaCostsToPay().getX(); - ability.addTarget(new TargetCreaturePermanent(numberOfTargets, numberOfTargets, filter, false)); - } -} - class OutmaneuverEffect extends AsThoughEffectImpl { OutmaneuverEffect() { diff --git a/Mage.Sets/src/mage/cards/p/PartWater.java b/Mage.Sets/src/mage/cards/p/PartWater.java index f6a919af20c..007525ef8c5 100644 --- a/Mage.Sets/src/mage/cards/p/PartWater.java +++ b/Mage.Sets/src/mage/cards/p/PartWater.java @@ -1,7 +1,6 @@ package mage.cards.p; -import mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.IslandwalkAbility; @@ -9,9 +8,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -28,7 +26,7 @@ public final class PartWater extends CardImpl { effect.setText("X target creatures gain islandwalk until end of turn"); this.getSpellAbility().getEffects().add(effect); this.getSpellAbility().getTargets().add(new TargetCreaturePermanent()); - this.getSpellAbility().setTargetAdjuster(PartWaterAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); } private PartWater(final PartWater card) { @@ -40,13 +38,3 @@ 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/PestInfestation.java b/Mage.Sets/src/mage/cards/p/PestInfestation.java index 9e53786cd88..5589131aa37 100644 --- a/Mage.Sets/src/mage/cards/p/PestInfestation.java +++ b/Mage.Sets/src/mage/cards/p/PestInfestation.java @@ -1,6 +1,5 @@ package mage.cards.p; -import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; import mage.abilities.dynamicvalue.common.ManacostVariableValue; @@ -10,10 +9,9 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.StaticFilters; -import mage.game.Game; import mage.game.permanent.token.Pest11GainLifeToken; import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -32,7 +30,8 @@ public final class PestInfestation extends CardImpl { .setText("destroy up to X target artifacts and/or enchantments.")); this.getSpellAbility().addEffect(new CreateTokenEffect(new Pest11GainLifeToken(), xValue) .setText("Create twice X 1/1 black and green Pest creature tokens with \"When this creature dies, you gain 1 life.\"")); - this.getSpellAbility().setTargetAdjuster(PestInfestationAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT)); } private PestInfestation(final PestInfestation card) { @@ -44,16 +43,3 @@ public final class PestInfestation extends CardImpl { return new PestInfestation(this); } } - -enum PestInfestationAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent( - 0, ability.getManaCostsToPay().getX(), - StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT, false - )); - } -} diff --git a/Mage.Sets/src/mage/cards/p/Plaguebearer.java b/Mage.Sets/src/mage/cards/p/Plaguebearer.java index 7c06d809fc3..5dac7bb4161 100644 --- a/Mage.Sets/src/mage/cards/p/Plaguebearer.java +++ b/Mage.Sets/src/mage/cards/p/Plaguebearer.java @@ -1,6 +1,5 @@ package mage.cards.p; -import java.util.UUID; import mage.MageInt; import mage.ObjectColor; import mage.abilities.Ability; @@ -16,7 +15,9 @@ import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; import mage.target.TargetPermanent; -import mage.target.targetadjustment.XCMCPermanentAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; + +import java.util.UUID; /** * @@ -40,7 +41,7 @@ public final class Plaguebearer extends CardImpl { // {X}{X}{B}: Destroy target nonblack creature with converted mana cost X. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl<>("{X}{X}{B}")); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(XCMCPermanentAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/p/PostmortemLunge.java b/Mage.Sets/src/mage/cards/p/PostmortemLunge.java index c08deda5e1e..1267092a481 100644 --- a/Mage.Sets/src/mage/cards/p/PostmortemLunge.java +++ b/Mage.Sets/src/mage/cards/p/PostmortemLunge.java @@ -10,16 +10,16 @@ import mage.abilities.keyword.HasteAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.filter.FilterCard; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; import mage.filter.StaticFilters; -import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import mage.target.targetpointer.FixedTarget; import java.util.UUID; @@ -35,7 +35,7 @@ public final class PostmortemLunge extends CardImpl { // Return target creature card with converted mana cost X from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step. this.getSpellAbility().addEffect(new PostmortemLungeEffect()); this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); - this.getSpellAbility().setTargetAdjuster(PostmortemLungeAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster()); } private PostmortemLunge(final PostmortemLunge card) { @@ -48,19 +48,6 @@ public final class PostmortemLunge extends CardImpl { } } -enum PostmortemLungeAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - FilterCard filter = new FilterCreatureCard("creature card with mana value " + xValue + " or less from your graveyard"); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.getTargets().add(new TargetCardInYourGraveyard(filter)); - } -} - class PostmortemLungeEffect extends OneShotEffect { PostmortemLungeEffect() { diff --git a/Mage.Sets/src/mage/cards/p/PrismaticBoon.java b/Mage.Sets/src/mage/cards/p/PrismaticBoon.java index 115a13cad3c..3a4e0cf0845 100644 --- a/Mage.Sets/src/mage/cards/p/PrismaticBoon.java +++ b/Mage.Sets/src/mage/cards/p/PrismaticBoon.java @@ -13,7 +13,7 @@ import mage.constants.Outcome; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.XTargetsAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -28,7 +28,7 @@ public final class PrismaticBoon extends CardImpl { // Choose a color. X target creatures gain protection from the chosen color until end of turn. this.getSpellAbility().addEffect(new PrismaticBoonEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().setTargetAdjuster(XTargetsAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); } private PrismaticBoon(final PrismaticBoon card) { diff --git a/Mage.Sets/src/mage/cards/q/QuarantineField.java b/Mage.Sets/src/mage/cards/q/QuarantineField.java index f86cf2d5a41..e9324303ae3 100644 --- a/Mage.Sets/src/mage/cards/q/QuarantineField.java +++ b/Mage.Sets/src/mage/cards/q/QuarantineField.java @@ -4,18 +4,16 @@ package mage.cards.q; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.dynamicvalue.common.CountersSourceCount; import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; import mage.abilities.effects.common.ExileUntilSourceLeavesEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.TargetController; import mage.counters.CounterType; -import mage.filter.common.FilterNonlandPermanent; -import mage.game.Game; -import mage.game.permanent.Permanent; +import mage.filter.StaticFilters; import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -34,7 +32,8 @@ public final class QuarantineField extends CardImpl { Ability ability = new EntersBattlefieldTriggeredAbility(new ExileUntilSourceLeavesEffect() .setText("for each isolation counter on it, exile up to one target nonland permanent an opponent controls until {this} leaves the battlefield") ); - ability.setTargetAdjuster(QuarantineFieldAdjuster.instance); + ability.setTargetAdjuster(new TargetsCountAdjuster(new CountersSourceCount(CounterType.ISOLATION))); + ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_OPPONENTS_PERMANENT_NON_LAND)); this.addAbility(ability); } @@ -47,18 +46,3 @@ public final class QuarantineField extends CardImpl { 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 counters = sourceObject.getCounters(game).getCount(CounterType.ISOLATION); - FilterNonlandPermanent filter = new FilterNonlandPermanent("nonland permanent" + (counters > 1 ? "s" : "") + " an opponent controls"); - filter.add(TargetController.OPPONENT.getControllerPredicate()); - ability.addTarget(new TargetPermanent(0, counters, filter)); - } - } -} diff --git a/Mage.Sets/src/mage/cards/q/QuillmaneBaku.java b/Mage.Sets/src/mage/cards/q/QuillmaneBaku.java index 9cd025ade2a..1df63b3abe7 100644 --- a/Mage.Sets/src/mage/cards/q/QuillmaneBaku.java +++ b/Mage.Sets/src/mage/cards/q/QuillmaneBaku.java @@ -1,11 +1,9 @@ package mage.cards.q; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.costs.Cost; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; @@ -14,15 +12,15 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.ComparisonType; +import mage.constants.SubType; import mage.counters.CounterType; import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; + +import java.util.UUID; /** * @author LevelX2 @@ -46,7 +44,7 @@ public final class QuillmaneBaku extends CardImpl { ability.addCost(new TapSourceCost()); ability.addCost(new RemoveVariableCountersSourceCost(CounterType.KI)); ability.addTarget(new TargetCreaturePermanent(filter)); - ability.setTargetAdjuster(QuillmaneBakuAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.OR_LESS)); this.addAbility(ability); } @@ -59,21 +57,3 @@ public final class QuillmaneBaku extends CardImpl { return new QuillmaneBaku(this); } } - -enum QuillmaneBakuAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = 0; - for (Cost cost : ability.getCosts()) { - if (cost instanceof RemoveVariableCountersSourceCost) { - xValue = ((RemoveVariableCountersSourceCost) cost).getAmount(); - } - } - ability.getTargets().clear(); - FilterCreaturePermanent newFilter = new FilterCreaturePermanent("creature with mana value " + xValue + " or less"); - newFilter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.addTarget(new TargetCreaturePermanent(newFilter)); - } -} diff --git a/Mage.Sets/src/mage/cards/r/RatsFeast.java b/Mage.Sets/src/mage/cards/r/RatsFeast.java index 04005378b42..057a5eb8cfb 100644 --- a/Mage.Sets/src/mage/cards/r/RatsFeast.java +++ b/Mage.Sets/src/mage/cards/r/RatsFeast.java @@ -1,14 +1,12 @@ package mage.cards.r; -import mage.abilities.Ability; import mage.abilities.effects.common.ExileTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.StaticFilters; -import mage.game.Game; import mage.target.common.TargetCardInASingleGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -22,7 +20,8 @@ public final class RatsFeast extends CardImpl { // Exile X target cards from a single graveyard. this.getSpellAbility().addEffect(new ExileTargetEffect("Exile X target cards from a single graveyard")); - this.getSpellAbility().setTargetAdjuster(RatsFeastAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCardInASingleGraveyard(1, 1, StaticFilters.FILTER_CARD_CARDS)); } private RatsFeast(final RatsFeast card) { @@ -34,14 +33,3 @@ public final class RatsFeast extends CardImpl { return new RatsFeast(this); } } - -enum RatsFeastAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - ability.getTargets().clear(); - ability.addTarget(new TargetCardInASingleGraveyard(xValue, xValue, StaticFilters.FILTER_CARD_CARDS)); - } -} diff --git a/Mage.Sets/src/mage/cards/r/RealitySpasm.java b/Mage.Sets/src/mage/cards/r/RealitySpasm.java index 7826915199f..bc20518b824 100644 --- a/Mage.Sets/src/mage/cards/r/RealitySpasm.java +++ b/Mage.Sets/src/mage/cards/r/RealitySpasm.java @@ -1,6 +1,5 @@ package mage.cards.r; -import java.util.UUID; import mage.abilities.Mode; import mage.abilities.effects.common.TapTargetEffect; import mage.abilities.effects.common.UntapTargetEffect; @@ -8,7 +7,9 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.target.TargetPermanent; -import mage.target.targetadjustment.XTargetsAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; + +import java.util.UUID; /** * @@ -25,7 +26,7 @@ public final class RealitySpasm extends CardImpl { Mode mode = new Mode(new UntapTargetEffect("untap X target permanents")); mode.addTarget(new TargetPermanent()); this.getSpellAbility().addMode(mode); - this.getSpellAbility().setTargetAdjuster(XTargetsAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); } private RealitySpasm(final RealitySpasm card) { diff --git a/Mage.Sets/src/mage/cards/r/Recantation.java b/Mage.Sets/src/mage/cards/r/Recantation.java index dfd61ffeb62..075da6e3c36 100644 --- a/Mage.Sets/src/mage/cards/r/Recantation.java +++ b/Mage.Sets/src/mage/cards/r/Recantation.java @@ -1,11 +1,11 @@ package mage.cards.r; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.CountersSourceCount; import mage.abilities.effects.Effect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -17,7 +17,9 @@ import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.FilterPermanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.VerseCounterAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; + +import java.util.UUID; /** * @@ -38,7 +40,7 @@ public final class Recantation extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{U}")); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetPermanent(0, 0, new FilterPermanent("up to X target permanents, where X is the number of verse counters on {this}."), false)); - ability.setTargetAdjuster(VerseCounterAdjuster.instance); + ability.setTargetAdjuster(new TargetsCountAdjuster(new CountersSourceCount(CounterType.VERSE))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/r/RedSunsTwilight.java b/Mage.Sets/src/mage/cards/r/RedSunsTwilight.java index cc360864b77..dda9d6e0980 100644 --- a/Mage.Sets/src/mage/cards/r/RedSunsTwilight.java +++ b/Mage.Sets/src/mage/cards/r/RedSunsTwilight.java @@ -14,7 +14,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetArtifactPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import mage.target.targetpointer.FixedTargets; import java.util.ArrayList; @@ -32,8 +32,8 @@ public class RedSunsTwilight extends CardImpl { // Destroy up to X target artifacts. // If X is 5 or more, for each artifact destroyed this way, create a token that's a copy of it. // Those tokens gain haste. Exile them at the beginning of the next end step. - this.getSpellAbility().addTarget(new TargetArtifactPermanent()); - this.getSpellAbility().setTargetAdjuster(RedSunsTwilightAdjuster.instance); + this.getSpellAbility().addTarget(new TargetArtifactPermanent(0, 1)); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); this.getSpellAbility().addEffect(new RedSunsTwilightEffect()); } @@ -47,18 +47,6 @@ public class RedSunsTwilight extends CardImpl { } } -enum RedSunsTwilightAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - // Select up to X artifacts - ability.addTarget(new TargetArtifactPermanent(0, xValue)); - } -} - class RedSunsTwilightEffect extends OneShotEffect { RedSunsTwilightEffect() { diff --git a/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java b/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java index 59a64bc73a4..d9c9b735537 100644 --- a/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java +++ b/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java @@ -1,17 +1,15 @@ package mage.cards.r; -import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; 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 mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -25,12 +23,12 @@ public final class ReleaseTheGremlins extends CardImpl { // Destroy X target artifacts. this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target artifacts")); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); this.getSpellAbility().addTarget(new TargetArtifactPermanent()); // Create X 2/2 red Gremlin creature tokens. this.getSpellAbility().addEffect(new CreateTokenEffect(new GremlinToken(), ManacostVariableValue.REGULAR)); - this.getSpellAbility().setTargetAdjuster(ReleaseTheGremlinsAdjuster.instance); } private ReleaseTheGremlins(final ReleaseTheGremlins card) { @@ -42,13 +40,3 @@ 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/Repeal.java b/Mage.Sets/src/mage/cards/r/Repeal.java index 341689d768d..fd131d488fa 100644 --- a/Mage.Sets/src/mage/cards/r/Repeal.java +++ b/Mage.Sets/src/mage/cards/r/Repeal.java @@ -1,19 +1,15 @@ package mage.cards.r; -import java.util.UUID; -import mage.abilities.Ability; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.filter.common.FilterNonlandPermanent; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; import mage.target.TargetPermanent; -import mage.target.common.TargetNonlandPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; + +import java.util.UUID; /** * @@ -27,7 +23,7 @@ public final class Repeal extends CardImpl { // Return target nonland permanent with converted mana cost X to its owner's hand. this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); this.getSpellAbility().addTarget(new TargetPermanent(new FilterNonlandPermanent("nonland permanent with mana value X"))); - this.getSpellAbility().setTargetAdjuster(RepealAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster()); // Draw a card. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("
")); @@ -42,16 +38,3 @@ public final class Repeal extends CardImpl { return new Repeal(this); } } - -enum RepealAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - FilterNonlandPermanent filter = new FilterNonlandPermanent("nonland permanent with mana value " + xValue); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.addTarget(new TargetNonlandPermanent(filter)); - } -} diff --git a/Mage.Sets/src/mage/cards/r/RestlessDreams.java b/Mage.Sets/src/mage/cards/r/RestlessDreams.java index c24e7fb1749..71ccc958eea 100644 --- a/Mage.Sets/src/mage/cards/r/RestlessDreams.java +++ b/Mage.Sets/src/mage/cards/r/RestlessDreams.java @@ -1,7 +1,5 @@ package mage.cards.r; -import mage.abilities.Ability; -import mage.abilities.costs.Cost; import mage.abilities.costs.common.DiscardXTargetCost; import mage.abilities.effects.Effect; import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; @@ -9,11 +7,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.StaticFilters; -import mage.filter.common.FilterCreatureCard; -import mage.game.Game; -import mage.target.Target; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -32,8 +27,8 @@ public final class RestlessDreams extends CardImpl { Effect effect = new ReturnFromGraveyardToHandTargetEffect(); effect.setText("Return X target creature cards from your graveyard to your hand"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().setTargetAdjuster(RestlessDreamsAdjuster.instance); - + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD)); } private RestlessDreams(final RestlessDreams card) { @@ -45,22 +40,3 @@ public final class RestlessDreams extends CardImpl { return new RestlessDreams(this); } } - -enum RestlessDreamsAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = 0; - for (Cost cost : ability.getCosts()) { - if (cost instanceof DiscardXTargetCost) { - xValue = ((DiscardXTargetCost) cost).getAmount(); - } - } - 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); - } -} diff --git a/Mage.Sets/src/mage/cards/r/ReturnToTheRanks.java b/Mage.Sets/src/mage/cards/r/ReturnToTheRanks.java index a2189dbc05d..6c576b44c0e 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 mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.abilities.keyword.ConvokeAbility; @@ -11,9 +10,8 @@ import mage.constants.CardType; import mage.constants.ComparisonType; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -21,6 +19,11 @@ import java.util.UUID; * @author LevelX2 */ public final class ReturnToTheRanks extends CardImpl { + private static final FilterCreatureCard filter = new FilterCreatureCard("creature cards with mana value 2 or less from your graveyard"); + + static { + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 3)); + } public ReturnToTheRanks(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{W}{W}"); @@ -32,7 +35,8 @@ public final class ReturnToTheRanks extends CardImpl { Effect effect = new ReturnFromGraveyardToBattlefieldTargetEffect(); effect.setText("Return X target creature cards with mana value 2 or less from your graveyard to the battlefield"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().setTargetAdjuster(ReturnToTheRanksAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter)); } private ReturnToTheRanks(final ReturnToTheRanks card) { @@ -44,19 +48,3 @@ 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 mana value 2 or less from your graveyard"); - - static { - filter.add(new ManaValuePredicate(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/RotHulk.java b/Mage.Sets/src/mage/cards/r/RotHulk.java index 79479b205f9..ded6248367e 100644 --- a/Mage.Sets/src/mage/cards/r/RotHulk.java +++ b/Mage.Sets/src/mage/cards/r/RotHulk.java @@ -3,6 +3,7 @@ package mage.cards.r; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.dynamicvalue.common.OpponentsCount; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.abilities.keyword.MenaceAbility; import mage.cards.CardImpl; @@ -10,9 +11,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.filter.FilterCard; -import mage.game.Game; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -20,6 +20,11 @@ import java.util.UUID; * @author JayDi85 */ public final class RotHulk extends CardImpl { + private static final FilterCard filterZombie = new FilterCard("Zombie cards from your graveyard"); + + static { + filterZombie.add(SubType.ZOMBIE.getPredicate()); + } public RotHulk(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{B}{B}"); @@ -33,7 +38,8 @@ public final class RotHulk extends CardImpl { // When Rot Hulk enters the battlefield, return up to X target Zombie cards from your graveyard to the battlefield, where X is the number of opponents you have. Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect() .setText("return up to X target Zombie cards from your graveyard to the battlefield, where X is the number of opponents you have.")); - ability.setTargetAdjuster(RotHulkAdjuster.instance); + ability.setTargetAdjuster(new TargetsCountAdjuster(OpponentsCount.instance)); + ability.addTarget(new TargetCardInYourGraveyard(0, 1, filterZombie)); this.addAbility(ability); } @@ -46,20 +52,3 @@ public final class RotHulk extends CardImpl { return new RotHulk(this); } } - -enum RotHulkAdjuster implements TargetAdjuster { - instance; - private static final FilterCard filterZombie = new FilterCard("Zombie cards from your graveyard"); - - static { - filterZombie.add(SubType.ZOMBIE.getPredicate()); - } - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard( - 0, game.getOpponents(ability.getControllerId()).size(), filterZombie - )); - } -} diff --git a/Mage.Sets/src/mage/cards/r/RumblingCrescendo.java b/Mage.Sets/src/mage/cards/r/RumblingCrescendo.java index 57e5ab12a05..299b75be345 100644 --- a/Mage.Sets/src/mage/cards/r/RumblingCrescendo.java +++ b/Mage.Sets/src/mage/cards/r/RumblingCrescendo.java @@ -1,11 +1,11 @@ package mage.cards.r; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.CountersSourceCount; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -16,9 +16,10 @@ import mage.constants.TargetController; import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.FilterPermanent; - import mage.target.TargetPermanent; -import mage.target.targetadjustment.VerseCounterAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; + +import java.util.UUID; /** * @@ -45,7 +46,7 @@ public final class RumblingCrescendo extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{R}")); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetPermanent(0, 0, filter, false)); - ability.setTargetAdjuster(VerseCounterAdjuster.instance); + ability.setTargetAdjuster(new TargetsCountAdjuster(new CountersSourceCount(CounterType.VERSE))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/r/RunedArch.java b/Mage.Sets/src/mage/cards/r/RunedArch.java index 114310a6263..bfb57ebfad9 100644 --- a/Mage.Sets/src/mage/cards/r/RunedArch.java +++ b/Mage.Sets/src/mage/cards/r/RunedArch.java @@ -1,6 +1,5 @@ package mage.cards.r; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SimpleActivatedAbility; @@ -16,7 +15,9 @@ import mage.constants.Duration; import mage.filter.FilterPermanent; import mage.filter.predicate.mageobject.PowerPredicate; import mage.target.TargetPermanent; -import mage.target.targetadjustment.XTargetsAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; + +import java.util.UUID; /** * @@ -46,7 +47,7 @@ public final class RunedArch extends CardImpl { ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(XTargetsAdjuster.instance); + ability.setTargetAdjuster(new XTargetsCountAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/r/RuthlessTechnomancer.java b/Mage.Sets/src/mage/cards/r/RuthlessTechnomancer.java index eeb16e5731e..3f338e4ca7b 100644 --- a/Mage.Sets/src/mage/cards/r/RuthlessTechnomancer.java +++ b/Mage.Sets/src/mage/cards/r/RuthlessTechnomancer.java @@ -6,7 +6,6 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeXTargetCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.cards.CardImpl; @@ -15,19 +14,16 @@ import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.Outcome; import mage.constants.SubType; -import mage.filter.FilterCard; import mage.filter.StaticFilters; import mage.filter.common.FilterControlledArtifactPermanent; import mage.filter.common.FilterControlledPermanent; -import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.mageobject.PowerPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.TreasureToken; import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.PowerTargetAdjuster; import java.util.UUID; @@ -57,7 +53,9 @@ public final class RuthlessTechnomancer extends CardImpl { new ManaCostsImpl<>("{2}{B}") ); ability.addCost(new SacrificeXTargetCost(filter, false, 1)); - this.addAbility(ability.setTargetAdjuster(RuthlessTechnomancerAdjuster.instance)); + ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS)); + ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); + this.addAbility(ability); } private RuthlessTechnomancer(final RuthlessTechnomancer card) { @@ -70,21 +68,6 @@ public final class RuthlessTechnomancer extends CardImpl { } } -enum RuthlessTechnomancerAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = GetXValue.instance.calculate(game, ability, null); - FilterCard filter = new FilterCreatureCard( - "creature card in your graveyard with power " + xValue + " or less" - ); - filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard(filter)); - } -} - class RuthlessTechnomancerEffect extends OneShotEffect { RuthlessTechnomancerEffect() { diff --git a/Mage.Sets/src/mage/cards/s/ScorchedEarth.java b/Mage.Sets/src/mage/cards/s/ScorchedEarth.java index 969690139b9..a40996fc00d 100644 --- a/Mage.Sets/src/mage/cards/s/ScorchedEarth.java +++ b/Mage.Sets/src/mage/cards/s/ScorchedEarth.java @@ -13,11 +13,10 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; import mage.filter.common.FilterLandCard; -import mage.filter.common.FilterLandPermanent; import mage.game.Game; import mage.target.common.TargetCardInHand; import mage.target.common.TargetLandPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -39,7 +38,7 @@ public final class ScorchedEarth extends CardImpl { effect.setText("Destroy X target lands"); this.getSpellAbility().addTarget(new TargetLandPermanent()); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().setTargetAdjuster(ScorchedEarthTargetAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); this.getSpellAbility().setCostAdjuster(ScorchedEarthCostAdjuster.instance); } @@ -53,17 +52,6 @@ public final class ScorchedEarth extends CardImpl { } } -enum ScorchedEarthTargetAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - ability.addTarget(new TargetLandPermanent(xValue, xValue, new FilterLandPermanent(), false)); - } -} - enum ScorchedEarthCostAdjuster implements CostAdjuster { instance; diff --git a/Mage.Sets/src/mage/cards/s/ScrapWelder.java b/Mage.Sets/src/mage/cards/s/ScrapWelder.java index 2e8559857b5..04f2e313da2 100644 --- a/Mage.Sets/src/mage/cards/s/ScrapWelder.java +++ b/Mage.Sets/src/mage/cards/s/ScrapWelder.java @@ -1,6 +1,5 @@ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -14,19 +13,21 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.Card; -import mage.constants.*; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterArtifactCard; +import mage.constants.*; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledArtifactPermanent; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** * * @author weirddan455 @@ -44,7 +45,8 @@ public final class ScrapWelder extends CardImpl { // {T}, Sacrifice an artifact with mana value X: Return target artifact card with mana value less than X from your graveyard to the battlefield. It gains haste until end of turn. Ability ability = new SimpleActivatedAbility(new ScrapWelderEffect(), new TapSourceCost()); ability.addCost(new ScrapWelderCost()); - ability.setTargetAdjuster(ScrapWelderTargetAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.FEWER_THAN)); + ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_ARTIFACT_FROM_YOUR_GRAVEYARD)); this.addAbility(ability); } @@ -115,22 +117,3 @@ class ScrapWelderCost extends VariableCostImpl { return new SacrificeTargetCost(filter); } } - -enum ScrapWelderTargetAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = 0; - for (Cost cost : ability.getCosts()) { - if (cost instanceof ScrapWelderCost) { - xValue = ((ScrapWelderCost) cost).getAmount(); - break; - } - } - FilterArtifactCard filter = new FilterArtifactCard("artifact card with mana value less than " + xValue + " from your graveyard"); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, xValue)); - ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard(filter)); - } -} diff --git a/Mage.Sets/src/mage/cards/s/SequenceEngine.java b/Mage.Sets/src/mage/cards/s/SequenceEngine.java index 6a62f1dc4ce..269e46d4bfe 100644 --- a/Mage.Sets/src/mage/cards/s/SequenceEngine.java +++ b/Mage.Sets/src/mage/cards/s/SequenceEngine.java @@ -9,14 +9,10 @@ import mage.abilities.effects.common.ExileTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; -import mage.filter.FilterCard; -import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; +import mage.filter.StaticFilters; import mage.game.permanent.token.FractalToken; import mage.target.common.TargetCardInGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -38,7 +34,8 @@ public final class SequenceEngine extends CardImpl { ability.addEffect(FractalToken.getEffect( ManacostVariableValue.REGULAR, "Put X +1/+1 counters on it" )); - ability.setTargetAdjuster(SequenceEngineAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster()); + ability.addTarget(new TargetCardInGraveyard(StaticFilters.FILTER_CARD_CREATURE_A_GRAVEYARD)); this.addAbility(ability); } @@ -51,16 +48,3 @@ public final class SequenceEngine extends CardImpl { return new SequenceEngine(this); } } - -enum SequenceEngineAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - ability.getTargets().clear(); - FilterCard filter = new FilterCreatureCard("creature card with mana value " + xValue); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.addTarget(new TargetCardInGraveyard(filter)); - } -} diff --git a/Mage.Sets/src/mage/cards/s/SereneSunset.java b/Mage.Sets/src/mage/cards/s/SereneSunset.java index 157e5d9a9eb..afa74182672 100644 --- a/Mage.Sets/src/mage/cards/s/SereneSunset.java +++ b/Mage.Sets/src/mage/cards/s/SereneSunset.java @@ -1,14 +1,12 @@ package mage.cards.s; -import mage.abilities.Ability; import mage.abilities.effects.common.PreventDamageByTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -23,7 +21,8 @@ public final class SereneSunset extends CardImpl { // Prevent all combat damage X target creatures would deal this turn. this.getSpellAbility().addEffect(new PreventDamageByTargetEffect(Duration.EndOfTurn, true) .setText("prevent all combat damage X target creatures would deal this turn")); - this.getSpellAbility().setTargetAdjuster(SereneSunsetAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private SereneSunset(final SereneSunset card) { @@ -35,13 +34,3 @@ public final class SereneSunset extends CardImpl { return new SereneSunset(this); } } - -enum SereneSunsetAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX())); - } -} diff --git a/Mage.Sets/src/mage/cards/s/SerrasLiturgy.java b/Mage.Sets/src/mage/cards/s/SerrasLiturgy.java index 1161801ad94..8cf69bd3dc1 100644 --- a/Mage.Sets/src/mage/cards/s/SerrasLiturgy.java +++ b/Mage.Sets/src/mage/cards/s/SerrasLiturgy.java @@ -1,11 +1,11 @@ package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.CountersSourceCount; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -18,7 +18,9 @@ import mage.counters.CounterType; import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.target.TargetPermanent; -import mage.target.targetadjustment.VerseCounterAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; + +import java.util.UUID; /** * @@ -48,7 +50,7 @@ public final class SerrasLiturgy extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{W}")); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetPermanent(0, 0, filter, false)); - ability.setTargetAdjuster(VerseCounterAdjuster.instance); + ability.setTargetAdjuster(new TargetsCountAdjuster(new CountersSourceCount(CounterType.VERSE))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/ShatteredCrypt.java b/Mage.Sets/src/mage/cards/s/ShatteredCrypt.java index 79b955aecc1..8fbb1f1b035 100644 --- a/Mage.Sets/src/mage/cards/s/ShatteredCrypt.java +++ b/Mage.Sets/src/mage/cards/s/ShatteredCrypt.java @@ -1,7 +1,6 @@ package mage.cards.s; -import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; @@ -9,11 +8,9 @@ import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterCreatureCard; -import mage.game.Game; -import mage.target.Target; +import mage.filter.StaticFilters; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -30,7 +27,8 @@ 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(ManacostVariableValue.REGULAR)); - this.getSpellAbility().setTargetAdjuster(ShatteredCryptAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD)); } private ShatteredCrypt(final ShatteredCrypt card) { @@ -42,15 +40,3 @@ 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/ShigekiJukaiVisionary.java b/Mage.Sets/src/mage/cards/s/ShigekiJukaiVisionary.java index 2ae8fd77f8a..03fd83fce65 100644 --- a/Mage.Sets/src/mage/cards/s/ShigekiJukaiVisionary.java +++ b/Mage.Sets/src/mage/cards/s/ShigekiJukaiVisionary.java @@ -11,13 +11,15 @@ import mage.abilities.effects.common.RevealLibraryPickControllerEffect; import mage.abilities.keyword.ChannelAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.PutCards; +import mage.constants.SubType; +import mage.constants.SuperType; import mage.filter.FilterCard; import mage.filter.StaticFilters; import mage.filter.predicate.Predicates; -import mage.game.Game; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -25,6 +27,11 @@ import java.util.UUID; * @author TheElk801 */ public final class ShigekiJukaiVisionary extends CardImpl { + private static final FilterCard filter = new FilterCard("nonlegendary cards from your graveyard"); + + static { + filter.add(Predicates.not(SuperType.LEGENDARY.getPredicate())); + } public ShigekiJukaiVisionary(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{1}{G}"); @@ -49,10 +56,13 @@ public final class ShigekiJukaiVisionary extends CardImpl { this.addAbility(ability); // Channel — {X}{X}{G}{G}, Discard Shigeki: Return X target nonlegendary cards from your graveyard to your hand. - this.addAbility(new ChannelAbility( + Ability ability2 = new ChannelAbility( "{X}{X}{G}{G}", new ReturnFromGraveyardToHandTargetEffect() .setText("return X target nonlegendary cards from your graveyard to your hand") - ).setTargetAdjuster(ShigekiJukaiVisionaryAdjuster.instance)); + ); + ability2.setTargetAdjuster(new XTargetsCountAdjuster()); + ability2.addTarget(new TargetCardInYourGraveyard(filter)); + this.addAbility(ability2); } private ShigekiJukaiVisionary(final ShigekiJukaiVisionary card) { @@ -64,18 +74,3 @@ public final class ShigekiJukaiVisionary extends CardImpl { return new ShigekiJukaiVisionary(this); } } - -enum ShigekiJukaiVisionaryAdjuster implements TargetAdjuster { - instance; - private static final FilterCard filter = new FilterCard("nonlegendary cards from your graveyard"); - - static { - filter.add(Predicates.not(SuperType.LEGENDARY.getPredicate())); - } - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard(ability.getManaCostsToPay().getX(), filter)); - } -} diff --git a/Mage.Sets/src/mage/cards/s/Silkguard.java b/Mage.Sets/src/mage/cards/s/Silkguard.java index c22d3a855b7..3fe996c0fe6 100644 --- a/Mage.Sets/src/mage/cards/s/Silkguard.java +++ b/Mage.Sets/src/mage/cards/s/Silkguard.java @@ -1,6 +1,5 @@ package mage.cards.s; -import mage.abilities.Ability; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.keyword.HexproofAbility; @@ -14,9 +13,8 @@ import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.ModifiedPredicate; -import mage.game.Game; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -45,7 +43,8 @@ public final class Silkguard extends CardImpl { // Put a +1/+1 counter on each of up to X target creatures you control. this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance()) .setText("put a +1/+1 counter on each of up to X target creatures you control")); - this.getSpellAbility().setTargetAdjuster(SilkguardAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent(0, 1)); // Auras, Equipment, and modified creatures you control gain hexproof until end of turn. this.getSpellAbility().addEffect(new GainAbilityControlledEffect( @@ -62,13 +61,3 @@ public final class Silkguard extends CardImpl { return new Silkguard(this); } } - -enum SilkguardAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetControlledCreaturePermanent(0, ability.getManaCostsToPay().getX())); - } -} diff --git a/Mage.Sets/src/mage/cards/s/SimicManipulator.java b/Mage.Sets/src/mage/cards/s/SimicManipulator.java index 7b6bf1ae443..2d7a78b6d27 100644 --- a/Mage.Sets/src/mage/cards/s/SimicManipulator.java +++ b/Mage.Sets/src/mage/cards/s/SimicManipulator.java @@ -1,28 +1,22 @@ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.Cost; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.abilities.keyword.EvolveAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.ComparisonType; -import mage.constants.SubType; -import mage.constants.Duration; -import mage.constants.Zone; +import mage.constants.*; import mage.counters.CounterType; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.PowerPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.PowerTargetAdjuster; + +import java.util.UUID; /** * Gatecrash FAQ (01.2013) @@ -55,7 +49,7 @@ public final class SimicManipulator extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainControlTargetEffect(Duration.Custom, true), new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent(filter)); ability.addCost(new RemoveVariableCountersSourceCost(CounterType.P1P1, 1, "Remove one or more +1/+1 counters from {this}")); - ability.setTargetAdjuster(SimicManipulatorAdjuster.instance); + ability.setTargetAdjuster(new PowerTargetAdjuster(RemovedCountersForCostValue.instance, ComparisonType.OR_LESS)); this.addAbility(ability); } @@ -68,25 +62,3 @@ public final class SimicManipulator extends CardImpl { return new SimicManipulator(this); } } - -enum SimicManipulatorAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(ability.getSourceId()); - if (sourcePermanent != null) { - int xValue = 0; - for (Cost cost : ability.getCosts()) { - if (cost instanceof RemoveVariableCountersSourceCost) { - xValue = ((RemoveVariableCountersSourceCost) cost).getAmount(); - break; - } - } - ability.getTargets().clear(); - FilterCreaturePermanent newFilter = new FilterCreaturePermanent("creature with power " + xValue + " or less"); - newFilter.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.addTarget(new TargetCreaturePermanent(newFilter)); - } - } -} diff --git a/Mage.Sets/src/mage/cards/s/SmokeSpiritsAid.java b/Mage.Sets/src/mage/cards/s/SmokeSpiritsAid.java index 2bf60604541..499a7094ba4 100644 --- a/Mage.Sets/src/mage/cards/s/SmokeSpiritsAid.java +++ b/Mage.Sets/src/mage/cards/s/SmokeSpiritsAid.java @@ -9,7 +9,7 @@ import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.token.SmokeBlessingToken; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -23,7 +23,8 @@ public final class SmokeSpiritsAid extends CardImpl { // For each of up to X target creatures, create a red Aura enchantment token named Smoke Blessing attached to that creature. Those tokens have enchant creature and "When enchanted creature dies, it deals 1 damage to its controller and you create a Treasure token." this.getSpellAbility().addEffect(new SmokeSpiritsAidEffect()); - this.getSpellAbility().setTargetAdjuster(SmokeSpiritsAidAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1)); } private SmokeSpiritsAid(final SmokeSpiritsAid card) { @@ -36,18 +37,6 @@ public final class SmokeSpiritsAid extends CardImpl { } } -enum SmokeSpiritsAidAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - if (ability.getManaCostsToPay().getX() > 0) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(0, ability.getManaCostsToPay().getX())); - } - } -} - class SmokeSpiritsAidEffect extends OneShotEffect { SmokeSpiritsAidEffect() { diff --git a/Mage.Sets/src/mage/cards/s/SorinVengefulBloodlord.java b/Mage.Sets/src/mage/cards/s/SorinVengefulBloodlord.java index b19f57b7ef4..eb40f97759f 100644 --- a/Mage.Sets/src/mage/cards/s/SorinVengefulBloodlord.java +++ b/Mage.Sets/src/mage/cards/s/SorinVengefulBloodlord.java @@ -4,8 +4,6 @@ import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.MyTurnCondition; -import mage.abilities.costs.Cost; -import mage.abilities.costs.common.PayVariableLoyaltyCost; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.DamageTargetEffect; @@ -16,15 +14,12 @@ import mage.abilities.keyword.LifelinkAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.FilterCard; import mage.filter.StaticFilters; -import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetPlayerOrPlaneswalker; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -59,7 +54,8 @@ public final class SorinVengefulBloodlord extends CardImpl { "Return target creature card with mana value X from your graveyard to the battlefield" )); ability.addEffect(new SorinVengefulBloodlordEffect()); - ability.setTargetAdjuster(SorinVengefulBloodlordAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster()); + ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); this.addAbility(ability); } @@ -73,24 +69,6 @@ public final class SorinVengefulBloodlord extends CardImpl { } } -enum SorinVengefulBloodlordAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = 0; - for (Cost cost : ability.getCosts()) { - if (cost instanceof PayVariableLoyaltyCost) { - xValue = ((PayVariableLoyaltyCost) cost).getAmount(); - } - } - FilterCard filter = new FilterCreatureCard("creature card with mana value " + xValue); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard(filter)); - } -} - class SorinVengefulBloodlordEffect extends ContinuousEffectImpl { SorinVengefulBloodlordEffect() { super(Duration.Custom, Outcome.Neutral); diff --git a/Mage.Sets/src/mage/cards/s/SpellBlast.java b/Mage.Sets/src/mage/cards/s/SpellBlast.java index 692ae53a1ed..05ac82f08e6 100644 --- a/Mage.Sets/src/mage/cards/s/SpellBlast.java +++ b/Mage.Sets/src/mage/cards/s/SpellBlast.java @@ -1,17 +1,12 @@ package mage.cards.s; -import mage.abilities.Ability; import mage.abilities.effects.common.CounterTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; -import mage.filter.FilterSpell; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; import mage.target.TargetSpell; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -25,7 +20,8 @@ public final class SpellBlast extends CardImpl { // Counter target spell with converted mana cost X. this.getSpellAbility().addEffect(new CounterTargetEffect().setText("counter target spell with mana value X")); - this.getSpellAbility().setTargetAdjuster(SpellBlastAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster()); + this.getSpellAbility().addTarget(new TargetSpell()); } private SpellBlast(final SpellBlast card) { @@ -37,16 +33,3 @@ public final class SpellBlast extends CardImpl { return new SpellBlast(this); } } - -enum SpellBlastAdjuster 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 mana value " + xValue); - filter.add(new ManaValuePredicate(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 f6599e6f6d6..ab5e2200461 100644 --- a/Mage.Sets/src/mage/cards/s/SpellBurst.java +++ b/Mage.Sets/src/mage/cards/s/SpellBurst.java @@ -1,18 +1,13 @@ package mage.cards.s; -import mage.abilities.Ability; import mage.abilities.effects.common.CounterTargetEffect; import mage.abilities.keyword.BuybackAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; -import mage.filter.FilterSpell; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; import mage.target.TargetSpell; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -29,7 +24,8 @@ public final class SpellBurst extends CardImpl { // Counter target spell with converted mana cost X. this.getSpellAbility().addEffect(new CounterTargetEffect().setText("counter target spell with mana value X")); - this.getSpellAbility().setTargetAdjuster(SpellBurstAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster()); + this.getSpellAbility().addTarget(new TargetSpell()); } private SpellBurst(final SpellBurst card) { @@ -41,16 +37,3 @@ 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 mana value " + xValue); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.addTarget(new TargetSpell(filter)); - } -} diff --git a/Mage.Sets/src/mage/cards/s/StirTheGrave.java b/Mage.Sets/src/mage/cards/s/StirTheGrave.java index 4e1abc9ec2a..d5ba1bc299d 100644 --- a/Mage.Sets/src/mage/cards/s/StirTheGrave.java +++ b/Mage.Sets/src/mage/cards/s/StirTheGrave.java @@ -1,18 +1,14 @@ package mage.cards.s; -import mage.abilities.Ability; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.filter.FilterCard; -import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; +import mage.filter.StaticFilters; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -26,7 +22,8 @@ public final class StirTheGrave extends CardImpl { // Return target creature card with converted mana cost X or less from your graveyard to the battlefield. this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect().setText("return target creature card with mana value X or less from your graveyard to the battlefield")); - this.getSpellAbility().setTargetAdjuster(StirTheGraveAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.OR_LESS)); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); } private StirTheGrave(final StirTheGrave card) { @@ -38,16 +35,3 @@ public final class StirTheGrave extends CardImpl { return new StirTheGrave(this); } } - -enum StirTheGraveAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - FilterCard filter = new FilterCreatureCard("creature card with mana value " + xValue + " or less from your graveyard"); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.getTargets().add(new TargetCardInYourGraveyard(filter)); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/StolenByTheFae.java b/Mage.Sets/src/mage/cards/s/StolenByTheFae.java index 0c9814f37dc..8584dbb5a17 100644 --- a/Mage.Sets/src/mage/cards/s/StolenByTheFae.java +++ b/Mage.Sets/src/mage/cards/s/StolenByTheFae.java @@ -1,19 +1,14 @@ package mage.cards.s; -import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; import mage.game.permanent.token.FaerieToken; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -30,7 +25,8 @@ public final class StolenByTheFae extends CardImpl { .setText("Return target creature with mana value X to its owner's hand")); this.getSpellAbility().addEffect(new CreateTokenEffect(new FaerieToken(), ManacostVariableValue.REGULAR) .setText("You create X 1/1 blue Faerie creature tokens with flying")); - this.getSpellAbility().setTargetAdjuster(StolenByTheFaeAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private StolenByTheFae(final StolenByTheFae card) { @@ -42,16 +38,3 @@ public final class StolenByTheFae extends CardImpl { return new StolenByTheFae(this); } } - -enum StolenByTheFaeAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with mana value " + xValue); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.addTarget(new TargetCreaturePermanent(filter)); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/StrengthOfTheTajuru.java b/Mage.Sets/src/mage/cards/s/StrengthOfTheTajuru.java index 8af26b81087..3b3d13695d8 100644 --- a/Mage.Sets/src/mage/cards/s/StrengthOfTheTajuru.java +++ b/Mage.Sets/src/mage/cards/s/StrengthOfTheTajuru.java @@ -1,7 +1,7 @@ package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; +import mage.abilities.dynamicvalue.IntPlusDynamicValue; import mage.abilities.dynamicvalue.common.MultikickerCount; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.MultikickerAbility; @@ -14,7 +14,9 @@ import mage.counters.CounterType; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; + +import java.util.UUID; /** * @author noxx @@ -29,8 +31,8 @@ public final class StrengthOfTheTajuru extends CardImpl { // Choose target creature, then choose another target creature for each time Strength of the Tajuru was kicked. Put X +1/+1 counters on each of them. this.getSpellAbility().addEffect(new StrengthOfTheTajuruAddCountersTargetEffect()); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE)); - this.getSpellAbility().setTargetAdjuster(StrengthOfTheTajuruAdjuster.instance); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(new IntPlusDynamicValue(1, MultikickerCount.instance))); } private StrengthOfTheTajuru(final StrengthOfTheTajuru card) { @@ -43,17 +45,6 @@ public final class StrengthOfTheTajuru extends CardImpl { } } -enum StrengthOfTheTajuruAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int numbTargets = MultikickerCount.instance.calculate(game, ability, null) + 1; - ability.addTarget(new TargetCreaturePermanent(0, numbTargets)); - } -} - class StrengthOfTheTajuruAddCountersTargetEffect extends OneShotEffect { StrengthOfTheTajuruAddCountersTargetEffect() { diff --git a/Mage.Sets/src/mage/cards/s/SupremeLeaderSnoke.java b/Mage.Sets/src/mage/cards/s/SupremeLeaderSnoke.java index 96a87f2d6d9..6e60cd54e5a 100644 --- a/Mage.Sets/src/mage/cards/s/SupremeLeaderSnoke.java +++ b/Mage.Sets/src/mage/cards/s/SupremeLeaderSnoke.java @@ -3,8 +3,6 @@ package mage.cards.s; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; -import mage.abilities.costs.Cost; -import mage.abilities.costs.common.PayVariableLoyaltyCost; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -21,14 +19,12 @@ import mage.constants.*; import mage.counters.Counter; import mage.counters.CounterType; import mage.filter.StaticFilters; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import mage.watchers.Watcher; import java.util.HashMap; @@ -63,7 +59,8 @@ public final class SupremeLeaderSnoke extends CardImpl { ability3.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield).setText("It gains haste")); ability3.addEffect(new GainAbilityTargetEffect(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new SacrificeSourceEffect()), Duration.WhileOnBattlefield) .setText("Sacrifice that creature at the beginning of the next end step")); - ability3.setTargetAdjuster(SupremeLeaderSnokeAdjuster.instance); + ability3.setTargetAdjuster(new XManaValueTargetAdjuster()); + ability3.addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_PERMANENT_CREATURE)); this.addAbility(ability3); } @@ -77,24 +74,6 @@ public final class SupremeLeaderSnoke extends CardImpl { } } -enum SupremeLeaderSnokeAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int cmc = 0; - for (Cost cost : ability.getCosts()) { - if (cost instanceof PayVariableLoyaltyCost) { - cmc = ((PayVariableLoyaltyCost) cost).getAmount(); - } - } - FilterCreaturePermanent newFilter = StaticFilters.FILTER_PERMANENT_CREATURE.copy(); - newFilter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, cmc)); - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(newFilter)); - } -} - enum OpponentNoncombatLostLifeCount implements DynamicValue { instance; diff --git a/Mage.Sets/src/mage/cards/s/SynodArtificer.java b/Mage.Sets/src/mage/cards/s/SynodArtificer.java index 639f71839f2..86adc35729d 100644 --- a/Mage.Sets/src/mage/cards/s/SynodArtificer.java +++ b/Mage.Sets/src/mage/cards/s/SynodArtificer.java @@ -1,6 +1,5 @@ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -17,7 +16,9 @@ import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.target.TargetPermanent; -import mage.target.targetadjustment.XTargetsAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; + +import java.util.UUID; /** * @@ -44,7 +45,7 @@ public final class SynodArtificer extends CardImpl { tapEffect.setText("Tap X target noncreature artifacts."); Ability tapAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, tapEffect, new ManaCostsImpl<>("{X}")); tapAbility.addCost(new TapSourceCost()); - tapAbility.setTargetAdjuster(XTargetsAdjuster.instance); + tapAbility.setTargetAdjuster(new XTargetsCountAdjuster()); tapAbility.addTarget(new TargetPermanent(filter)); this.addAbility(tapAbility); @@ -53,7 +54,7 @@ public final class SynodArtificer extends CardImpl { untapEffect.setText("Untap X target noncreature artifacts."); Ability untapAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, untapEffect, new ManaCostsImpl<>("{X}")); untapAbility.addCost(new TapSourceCost()); - untapAbility.setTargetAdjuster(XTargetsAdjuster.instance); + untapAbility.setTargetAdjuster(new XTargetsCountAdjuster()); untapAbility.addTarget(new TargetPermanent(filter)); this.addAbility(untapAbility); } diff --git a/Mage.Sets/src/mage/cards/t/TameshiRealityArchitect.java b/Mage.Sets/src/mage/cards/t/TameshiRealityArchitect.java index b0e975a888d..e225818bf05 100644 --- a/Mage.Sets/src/mage/cards/t/TameshiRealityArchitect.java +++ b/Mage.Sets/src/mage/cards/t/TameshiRealityArchitect.java @@ -11,16 +11,13 @@ import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffec import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.FilterCard; import mage.filter.FilterPermanent; import mage.filter.StaticFilters; import mage.filter.common.FilterArtifactOrEnchantmentCard; import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetControlledPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -59,7 +56,9 @@ public final class TameshiRealityArchitect extends CardImpl { ability.addCost(new ReturnToHandChosenControlledPermanentCost( new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_PERMANENT_LAND) )); - this.addAbility(ability.setTargetAdjuster(TameshiRealityArchitectAdjuster.instance)); + ability.setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.OR_LESS)); + ability.addTarget(new TargetCardInYourGraveyard(new FilterArtifactOrEnchantmentCard())); + this.addAbility(ability); } private TameshiRealityArchitect(final TameshiRealityArchitect card) { @@ -71,18 +70,3 @@ public final class TameshiRealityArchitect extends CardImpl { return new TameshiRealityArchitect(this); } } - -enum TameshiRealityArchitectAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - FilterCard filter = new FilterArtifactOrEnchantmentCard( - "artifact or enchantment card with mana value " + xValue + " or less from your graveyard" - ); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard(filter)); - } -} diff --git a/Mage.Sets/src/mage/cards/t/TamiyoCompleatedSage.java b/Mage.Sets/src/mage/cards/t/TamiyoCompleatedSage.java index 4524d8cd9fc..0f54ce2ab1e 100644 --- a/Mage.Sets/src/mage/cards/t/TamiyoCompleatedSage.java +++ b/Mage.Sets/src/mage/cards/t/TamiyoCompleatedSage.java @@ -2,7 +2,6 @@ package mage.cards.t; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.dynamicvalue.common.GetXLoyaltyValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenCopyTargetEffect; import mage.abilities.effects.common.CreateTokenEffect; @@ -15,16 +14,15 @@ import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.FilterCard; import mage.filter.StaticFilters; -import mage.filter.common.FilterPermanentCard; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.filter.common.FilterNonlandCard; +import mage.filter.predicate.mageobject.PermanentPredicate; import mage.game.Game; import mage.game.permanent.PermanentCard; import mage.game.permanent.token.TamiyosNotebookToken; import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import mage.util.CardUtil; import java.util.UUID; @@ -33,6 +31,11 @@ import java.util.UUID; * @author TheElk801 */ public final class TamiyoCompleatedSage extends CardImpl { + private static final FilterCard filter = new FilterNonlandCard("nonland permanent card"); + + static { + filter.add(PermanentPredicate.instance); + } public TamiyoCompleatedSage(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{G}{G/U/P}{U}"); @@ -53,7 +56,10 @@ public final class TamiyoCompleatedSage extends CardImpl { this.addAbility(ability); // −X: Exile target nonland permanent card with mana value X from your graveyard. Create a token that's a copy of that card. - this.addAbility(new LoyaltyAbility(new TamiyoCompleatedSageEffect()).setTargetAdjuster(TamiyoCompleatedSageAdjuster.instance)); + Ability ability2 = new LoyaltyAbility(new TamiyoCompleatedSageEffect()); + ability2.setTargetAdjuster(new XManaValueTargetAdjuster()); + ability2.addTarget(new TargetCardInYourGraveyard(filter)); + this.addAbility(ability2); // −7: Create Tamiyo's Notebook, a legendary colorless artifact token with "Spells you cast cost {2} less to cast" and "{T}: Draw a card." this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new TamiyosNotebookToken()), -7)); @@ -69,20 +75,6 @@ public final class TamiyoCompleatedSage extends CardImpl { } } -enum TamiyoCompleatedSageAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = GetXLoyaltyValue.instance.calculate(game, ability, null); - FilterCard filter = new FilterPermanentCard("nonland permanent card with mana value " + xValue); - filter.add(Predicates.not(CardType.LAND.getPredicate())); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard(filter)); - } -} - class TamiyoCompleatedSageEffect extends OneShotEffect { TamiyoCompleatedSageEffect() { diff --git a/Mage.Sets/src/mage/cards/t/TemporalFirestorm.java b/Mage.Sets/src/mage/cards/t/TemporalFirestorm.java index fd41a8a1fe3..c91b2727a3f 100644 --- a/Mage.Sets/src/mage/cards/t/TemporalFirestorm.java +++ b/Mage.Sets/src/mage/cards/t/TemporalFirestorm.java @@ -1,6 +1,5 @@ package mage.cards.t; -import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.MultikickerCount; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.PhaseOutTargetEffect; @@ -12,9 +11,8 @@ import mage.constants.TargetController; import mage.filter.FilterPermanent; import mage.filter.StaticFilters; import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent; -import mage.game.Game; import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -22,6 +20,11 @@ import java.util.UUID; * @author TheElk801 */ public final class TemporalFirestorm extends CardImpl { + private static final FilterPermanent filter = new FilterCreatureOrPlaneswalkerPermanent("creatures and/or planeswalkers you control"); + + static { + filter.add(TargetController.YOU.getControllerPredicate()); + } public TemporalFirestorm(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{R}{R}"); @@ -34,7 +37,8 @@ public final class TemporalFirestorm extends CardImpl { // Choose up to X creatures and/or planeswalkers you control, where X is the number of times this spell was kicked. Those permanents phase out. this.getSpellAbility().addEffect(new PhaseOutTargetEffect().setText("choose up to X creatures and/or " + "planeswalkers you control, where X is the number of times this spell was kicked. Those permanents phase out")); - this.getSpellAbility().setTargetAdjuster(TemporalFirestormAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(MultikickerCount.instance)); + this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter, true)); // Temporal Firestorm deals 5 damage to each creature and each planeswalker. this.getSpellAbility().addEffect(new DamageAllEffect( @@ -51,21 +55,3 @@ public final class TemporalFirestorm extends CardImpl { return new TemporalFirestorm(this); } } - -enum TemporalFirestormAdjuster implements TargetAdjuster { - instance; - private static final FilterPermanent filter = new FilterCreatureOrPlaneswalkerPermanent("creatures and/or planeswalkers you control"); - - static { - filter.add(TargetController.YOU.getControllerPredicate()); - } - - @Override - public void adjustTargets(Ability ability, Game game) { - int kickedCount = MultikickerCount.instance.calculate(game, ability, null); - if (kickedCount > 0) { - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(0, kickedCount, filter)); - } - } -} diff --git a/Mage.Sets/src/mage/cards/t/TheBattleOfNaboo.java b/Mage.Sets/src/mage/cards/t/TheBattleOfNaboo.java index 9890d764507..66a4d251f2d 100644 --- a/Mage.Sets/src/mage/cards/t/TheBattleOfNaboo.java +++ b/Mage.Sets/src/mage/cards/t/TheBattleOfNaboo.java @@ -12,7 +12,7 @@ import mage.constants.Outcome; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -29,7 +29,8 @@ public final class TheBattleOfNaboo extends CardImpl { effect.setText("Return X target creatures to their owner's hands"); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addEffect(new TheBattleOfNabooEffect()); - this.getSpellAbility().setTargetAdjuster(TheBattleOfNabooAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private TheBattleOfNaboo(final TheBattleOfNaboo card) { @@ -42,16 +43,6 @@ public final class TheBattleOfNaboo extends CardImpl { } } -enum TheBattleOfNabooAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX())); - } -} - class TheBattleOfNabooEffect extends OneShotEffect { TheBattleOfNabooEffect() { diff --git a/Mage.Sets/src/mage/cards/t/TheCrowdGoesWild.java b/Mage.Sets/src/mage/cards/t/TheCrowdGoesWild.java index 5bb5fac8c7c..abc47d6f95d 100644 --- a/Mage.Sets/src/mage/cards/t/TheCrowdGoesWild.java +++ b/Mage.Sets/src/mage/cards/t/TheCrowdGoesWild.java @@ -1,7 +1,6 @@ package mage.cards.t; -import mage.abilities.Ability; import mage.abilities.effects.common.continuous.GainAbilityAllEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.keyword.AssistAbility; @@ -12,9 +11,8 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.counters.CounterType; import mage.filter.common.FilterCreaturePermanent; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -39,8 +37,8 @@ public final class TheCrowdGoesWild extends CardImpl { this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance()) .setText("Support X (Put a +1/+1 counter on each of up to X target creatures.)
") ); - this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().setTargetAdjuster(TheCrowdGoesWildAdjuster.instance); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1)); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); // 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)); @@ -55,13 +53,3 @@ public final class TheCrowdGoesWild extends CardImpl { 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/TheMycosynthGardens.java b/Mage.Sets/src/mage/cards/t/TheMycosynthGardens.java index 3b5ea29b6f8..84f7e2fda2d 100644 --- a/Mage.Sets/src/mage/cards/t/TheMycosynthGardens.java +++ b/Mage.Sets/src/mage/cards/t/TheMycosynthGardens.java @@ -19,7 +19,7 @@ import mage.filter.predicate.permanent.TokenPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; -import mage.target.targetadjustment.XCMCPermanentAdjuster; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import mage.util.functions.EmptyCopyApplier; import java.util.UUID; @@ -53,7 +53,7 @@ public final class TheMycosynthGardens extends CardImpl { ability = new SimpleActivatedAbility(new TheMycosynthGardensCopyEffect(), new ManaCostsImpl<>("{X}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPermanent(filter)); - ability.setTargetAdjuster(XCMCPermanentAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/t/TheWiseMothman.java b/Mage.Sets/src/mage/cards/t/TheWiseMothman.java index 1326bf34ee5..3e9bc7ae498 100644 --- a/Mage.Sets/src/mage/cards/t/TheWiseMothman.java +++ b/Mage.Sets/src/mage/cards/t/TheWiseMothman.java @@ -4,7 +4,6 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility; import mage.abilities.common.OneOrMoreMilledTriggeredAbility; -import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.SavedMilledValue; import mage.abilities.effects.common.counter.AddCountersPlayersEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; @@ -17,9 +16,8 @@ import mage.constants.SuperType; import mage.constants.TargetController; import mage.counters.CounterType; import mage.filter.StaticFilters; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -53,7 +51,7 @@ public final class TheWiseMothman extends CardImpl { + "where X is the number of nonland cards milled this way") ); ability.addTarget(new TargetCreaturePermanent(0, 0)); - ability.setTargetAdjuster(new TheWiseMothmanAdjuster(SavedMilledValue.MUCH)); + ability.setTargetAdjuster(new TargetsCountAdjuster(SavedMilledValue.MUCH)); this.addAbility(ability); } @@ -66,21 +64,3 @@ public final class TheWiseMothman extends CardImpl { return new TheWiseMothman(this); } } - -// TODO: cleanup after #12107 -class TheWiseMothmanAdjuster implements TargetAdjuster { - private final DynamicValue dynamicValue; - - TheWiseMothmanAdjuster(DynamicValue value) { - this.dynamicValue = value; - } - - @Override - public void adjustTargets(Ability ability, Game game) { - int count = dynamicValue.calculate(game, ability, ability.getEffects().get(0)); - ability.getTargets().clear(); - if (count > 0) { - ability.addTarget(new TargetCreaturePermanent(0, count)); - } - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/t/ThievingSkydiver.java b/Mage.Sets/src/mage/cards/t/ThievingSkydiver.java index 4cb44d55f5a..4bfd5bb6c2a 100644 --- a/Mage.Sets/src/mage/cards/t/ThievingSkydiver.java +++ b/Mage.Sets/src/mage/cards/t/ThievingSkydiver.java @@ -5,7 +5,6 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.KickedCondition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.dynamicvalue.common.GetKickerXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.abilities.keyword.FlyingAbility; @@ -13,13 +12,10 @@ import mage.abilities.keyword.KickerAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.FilterPermanent; -import mage.filter.common.FilterArtifactPermanent; -import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.common.TargetArtifactPermanent; +import mage.target.targetadjustment.XManaValueTargetAdjuster; import java.util.UUID; @@ -55,7 +51,8 @@ public final class ThievingSkydiver extends CardImpl { "If that artifact is an Equipment, attach it to {this}." ); ability.addEffect(new ThievingSkydiverEffect()); - ability.setTargetAdjuster(ThievingSkydiverAdjuster.instance); + ability.setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.OR_LESS)); + ability.addTarget(new TargetArtifactPermanent()); this.addAbility(ability); } @@ -69,21 +66,6 @@ public final class ThievingSkydiver extends CardImpl { } } -enum ThievingSkydiverAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = GetKickerXValue.instance.calculate(game, ability, null); - FilterPermanent filter = new FilterArtifactPermanent( - "artifact with mana value " + xValue + " or less" - ); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, xValue + 1)); - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(filter)); - } -} - class ThievingSkydiverEffect extends OneShotEffect { ThievingSkydiverEffect() { diff --git a/Mage.Sets/src/mage/cards/t/Thrive.java b/Mage.Sets/src/mage/cards/t/Thrive.java index 4ce85372f66..bee5cf6044c 100644 --- a/Mage.Sets/src/mage/cards/t/Thrive.java +++ b/Mage.Sets/src/mage/cards/t/Thrive.java @@ -1,16 +1,14 @@ package mage.cards.t; -import mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.counters.CounterType; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -26,7 +24,8 @@ public final class Thrive extends CardImpl { 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().setTargetAdjuster(ThriveAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private Thrive(final Thrive card) { @@ -38,13 +37,3 @@ public final class Thrive extends CardImpl { return new Thrive(this); } } - -enum ThriveAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - 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 01716915bcb..df1d4de6f10 100644 --- a/Mage.Sets/src/mage/cards/t/TurbulentDreams.java +++ b/Mage.Sets/src/mage/cards/t/TurbulentDreams.java @@ -1,19 +1,14 @@ package mage.cards.t; -import mage.abilities.Ability; import mage.abilities.costs.common.DiscardXTargetCost; 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.FilterPermanent; 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 mage.target.common.TargetNonlandPermanent; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -32,7 +27,8 @@ public final class TurbulentDreams extends CardImpl { Effect effect = new ReturnToHandTargetEffect(); effect.setText("Return X target nonland permanents to their owners' hands"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().setTargetAdjuster(TurbulentDreamsAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetNonlandPermanent()); } private TurbulentDreams(final TurbulentDreams card) { @@ -44,14 +40,3 @@ public final class TurbulentDreams extends CardImpl { 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(ability.getCosts().getVariableCosts().get(0).getAmount(), filter); - ability.addTarget(target); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/v/VengefulDreams.java b/Mage.Sets/src/mage/cards/v/VengefulDreams.java index f02a5a1da6c..0082e66b608 100644 --- a/Mage.Sets/src/mage/cards/v/VengefulDreams.java +++ b/Mage.Sets/src/mage/cards/v/VengefulDreams.java @@ -1,6 +1,5 @@ package mage.cards.v; -import mage.abilities.Ability; import mage.abilities.costs.common.DiscardXTargetCost; import mage.abilities.effects.Effect; import mage.abilities.effects.common.ExileTargetEffect; @@ -8,11 +7,9 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.FilterCard; -import mage.filter.common.FilterAttackingCreature; -import mage.game.Game; -import mage.target.Target; +import mage.filter.StaticFilters; import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -31,7 +28,8 @@ public final class VengefulDreams extends CardImpl { Effect effect = new ExileTargetEffect(); effect.setText("Exile X target attacking creatures"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().setTargetAdjuster(VengefulDreamsAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_ATTACKING_CREATURES)); } private VengefulDreams(final VengefulDreams card) { @@ -43,13 +41,3 @@ public final class VengefulDreams extends CardImpl { return new VengefulDreams(this); } } - -enum VengefulDreamsAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - Target target = new TargetPermanent(ability.getCosts().getVariableCosts().get(0).getAmount(), new FilterAttackingCreature()); - ability.addTarget(target); - } -} diff --git a/Mage.Sets/src/mage/cards/v/VileRequiem.java b/Mage.Sets/src/mage/cards/v/VileRequiem.java index 8a943b71576..3d9b9326b38 100644 --- a/Mage.Sets/src/mage/cards/v/VileRequiem.java +++ b/Mage.Sets/src/mage/cards/v/VileRequiem.java @@ -1,12 +1,12 @@ package mage.cards.v; -import java.util.UUID; import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.CountersSourceCount; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -20,7 +20,9 @@ import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; import mage.target.TargetPermanent; -import mage.target.targetadjustment.VerseCounterAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; + +import java.util.UUID; /** * @@ -48,7 +50,7 @@ public final class VileRequiem extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{1}{B}")); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetPermanent(0, 0, filter, false)); - ability.setTargetAdjuster(VerseCounterAdjuster.instance); + ability.setTargetAdjuster(new TargetsCountAdjuster(new CountersSourceCount(CounterType.VERSE))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/v/VitalityHunter.java b/Mage.Sets/src/mage/cards/v/VitalityHunter.java index f0d1a180e6a..3c97b91f27d 100644 --- a/Mage.Sets/src/mage/cards/v/VitalityHunter.java +++ b/Mage.Sets/src/mage/cards/v/VitalityHunter.java @@ -3,6 +3,7 @@ package mage.cards.v; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility; +import mage.abilities.dynamicvalue.common.GetMonstrosityXValue; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.keyword.LifelinkAbility; import mage.abilities.keyword.MonstrosityAbility; @@ -11,9 +12,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.counters.CounterType; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -40,7 +40,8 @@ public final class VitalityHunter extends CardImpl { new AddCountersTargetEffect(CounterType.LIFELINK.createInstance()) .setText("put a lifelink counter on each of up to X target creatures") ); - ability.setTargetAdjuster(VitalityHunterAdjuster.instance); + ability.setTargetAdjuster(new TargetsCountAdjuster(GetMonstrosityXValue.instance)); + ability.addTarget(new TargetCreaturePermanent(0, 1)); this.addAbility(ability); } @@ -53,14 +54,3 @@ public final class VitalityHunter extends CardImpl { return new VitalityHunter(this); } } - -enum VitalityHunterAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ((BecomesMonstrousSourceTriggeredAbility) ability).getMonstrosityValue(); - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(0, xValue)); - } -} diff --git a/Mage.Sets/src/mage/cards/v/VivienArkbowRanger.java b/Mage.Sets/src/mage/cards/v/VivienArkbowRanger.java index 8a02cac9e05..699ff98981f 100644 --- a/Mage.Sets/src/mage/cards/v/VivienArkbowRanger.java +++ b/Mage.Sets/src/mage/cards/v/VivienArkbowRanger.java @@ -16,11 +16,9 @@ import mage.constants.SubType; import mage.constants.SuperType; import mage.counters.CounterType; import mage.filter.StaticFilters; -import mage.game.Game; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreatureOrPlaneswalker; import mage.target.common.TargetCreaturePermanentAmount; -import mage.target.targetadjustment.TargetAdjuster; import java.util.UUID; @@ -47,8 +45,6 @@ public final class VivienArkbowRanger extends CardImpl { target.setMinNumberOfTargets(0); target.setMaxNumberOfTargets(2); ability.addTarget(target); - - // ability.setTargetAdjuster(VivienArkbowRangerAdjuster.instance); this.addAbility(ability); // −3: Target creature you control deals damage equal to its power to target creature or planeswalker. @@ -70,17 +66,4 @@ public final class VivienArkbowRanger extends CardImpl { public VivienArkbowRanger copy() { return new VivienArkbowRanger(this); } - - enum VivienArkbowRangerAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - // if targets are available, switch over to a working target method - if (game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, game).size() > 0) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanentAmount(2)); - } - } - } } diff --git a/Mage.Sets/src/mage/cards/v/VolcanicEruption.java b/Mage.Sets/src/mage/cards/v/VolcanicEruption.java index 7330d0f7bec..bcf35b44949 100644 --- a/Mage.Sets/src/mage/cards/v/VolcanicEruption.java +++ b/Mage.Sets/src/mage/cards/v/VolcanicEruption.java @@ -14,7 +14,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetLandPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.List; import java.util.UUID; @@ -23,13 +23,16 @@ import java.util.UUID; * @author escplan9 (Derek Monturo - dmontur1 at gmail dot com) */ public final class VolcanicEruption extends CardImpl { + private static final FilterLandPermanent filter + = new FilterLandPermanent(SubType.MOUNTAIN, "Mountain"); public VolcanicEruption(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{U}{U}{U}"); // Destroy X target Mountains. Volcanic Eruption deals damage to each creature and each player equal to the number of Mountains put into a graveyard this way. this.getSpellAbility().addEffect(new VolcanicEruptionEffect()); - this.getSpellAbility().setTargetAdjuster(VolcanicEruptionAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetLandPermanent(filter)); } private VolcanicEruption(final VolcanicEruption card) { @@ -42,19 +45,6 @@ public final class VolcanicEruption extends CardImpl { } } -enum VolcanicEruptionAdjuster implements TargetAdjuster { - instance; - private static final FilterLandPermanent filter - = new FilterLandPermanent(SubType.MOUNTAIN, "Mountain"); - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); - ability.addTarget(new TargetLandPermanent(xValue, xValue, filter, false)); - } -} - class VolcanicEruptionEffect extends OneShotEffect { VolcanicEruptionEffect() { diff --git a/Mage.Sets/src/mage/cards/v/VoyagerDrake.java b/Mage.Sets/src/mage/cards/v/VoyagerDrake.java index d3d9dc2e8c5..94532a7c9c0 100644 --- a/Mage.Sets/src/mage/cards/v/VoyagerDrake.java +++ b/Mage.Sets/src/mage/cards/v/VoyagerDrake.java @@ -13,9 +13,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import java.util.UUID; @@ -44,7 +43,8 @@ public final class VoyagerDrake extends CardImpl { ).setText("up to X target creatures gain flying until end of turn, " + "where X is the number of times {this} was kicked.") ); - ability.setTargetAdjuster(VoyagerDrakeAdjuster.instance); + ability.setTargetAdjuster(new TargetsCountAdjuster(MultikickerCount.instance)); + ability.addTarget(new TargetCreaturePermanent(0, 1)); this.addAbility(ability); } @@ -57,16 +57,3 @@ public final class VoyagerDrake extends CardImpl { return new VoyagerDrake(this); } } - -enum VoyagerDrakeAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - int numbTargets = MultikickerCount.instance.calculate(game, ability, null); - if (numbTargets > 0) { - ability.addTarget(new TargetCreaturePermanent(0, numbTargets)); - } - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/w/WakeTheDead.java b/Mage.Sets/src/mage/cards/w/WakeTheDead.java index 5be15e17f43..433d928ddc5 100644 --- a/Mage.Sets/src/mage/cards/w/WakeTheDead.java +++ b/Mage.Sets/src/mage/cards/w/WakeTheDead.java @@ -22,7 +22,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import mage.target.targetpointer.FixedTargets; import java.util.ArrayList; @@ -42,7 +42,8 @@ public final class WakeTheDead extends CardImpl { // Return X target creature cards from your graveyard to the battlefield. Sacrifice those creatures at the beginning of the next end step. this.getSpellAbility().addEffect(new WakeTheDeadReturnFromGraveyardToBattlefieldTargetEffect()); - this.getSpellAbility().setTargetAdjuster(WakeTheDeadAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); } private WakeTheDead(final WakeTheDead card) { @@ -55,16 +56,6 @@ public final class WakeTheDead extends CardImpl { } } -enum WakeTheDeadAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard(ability.getManaCostsToPay().getX(), StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD)); - } -} - class WakeTheDeadReturnFromGraveyardToBattlefieldTargetEffect extends OneShotEffect { WakeTheDeadReturnFromGraveyardToBattlefieldTargetEffect() { diff --git a/Mage.Sets/src/mage/cards/w/WaveOfIndifference.java b/Mage.Sets/src/mage/cards/w/WaveOfIndifference.java index 4b4b6c92750..32f3bf9f0d6 100644 --- a/Mage.Sets/src/mage/cards/w/WaveOfIndifference.java +++ b/Mage.Sets/src/mage/cards/w/WaveOfIndifference.java @@ -1,16 +1,14 @@ package mage.cards.w; -import mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.abilities.effects.common.combat.CantBlockTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -26,7 +24,8 @@ public final class WaveOfIndifference extends CardImpl { Effect effect = new CantBlockTargetEffect(Duration.EndOfTurn); effect.setText("X target creatures can't block this turn"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().setTargetAdjuster(WaveOfIndifferenceAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private WaveOfIndifference(final WaveOfIndifference card) { @@ -38,13 +37,3 @@ public final class WaveOfIndifference extends CardImpl { return new WaveOfIndifference(this); } } - -enum WaveOfIndifferenceAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX())); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/w/WaxmaneBaku.java b/Mage.Sets/src/mage/cards/w/WaxmaneBaku.java index 1b25a882301..b1e995181bc 100644 --- a/Mage.Sets/src/mage/cards/w/WaxmaneBaku.java +++ b/Mage.Sets/src/mage/cards/w/WaxmaneBaku.java @@ -1,11 +1,9 @@ package mage.cards.w; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.costs.Cost; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.TapTargetEffect; @@ -16,9 +14,10 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.counters.CounterType; import mage.filter.StaticFilters; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; + +import java.util.UUID; /** @@ -32,14 +31,15 @@ public final class WaxmaneBaku extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(2); - + // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Waxmane Baku. this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.FILTER_SPIRIT_OR_ARCANE_CARD, true)); // {1}, Remove X ki counters from Waxmane Baku: Tap X target creatures. Ability ability = new SimpleActivatedAbility(new TapTargetEffect("tap X target creatures"), new GenericManaCost(1)); ability.addCost(new RemoveVariableCountersSourceCost(CounterType.KI)); - ability.setTargetAdjuster(WaxmaneBakuAdjuster.instance); + ability.setTargetAdjuster(new XTargetsCountAdjuster()); + ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } @@ -52,19 +52,3 @@ public final class WaxmaneBaku extends CardImpl { return new WaxmaneBaku(this); } } - -enum WaxmaneBakuAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = 0; - for (Cost cost : ability.getCosts()) { - if (cost instanceof RemoveVariableCountersSourceCost) { - xValue = ((RemoveVariableCountersSourceCost) cost).getAmount(); - } - } - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(xValue)); - } -} diff --git a/Mage.Sets/src/mage/cards/w/WildestDreams.java b/Mage.Sets/src/mage/cards/w/WildestDreams.java index 427cb2b71aa..b71233be7b8 100644 --- a/Mage.Sets/src/mage/cards/w/WildestDreams.java +++ b/Mage.Sets/src/mage/cards/w/WildestDreams.java @@ -1,17 +1,14 @@ package mage.cards.w; -import mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.abilities.effects.common.ExileSpellEffect; import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.StaticFilters; -import mage.game.Game; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -28,7 +25,8 @@ public final class WildestDreams extends CardImpl { Effect effect = new ReturnFromGraveyardToHandTargetEffect(); effect.setText("Return X target cards from your graveyard to your hand"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().setTargetAdjuster(WildestDreamsAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard()); this.getSpellAbility().addEffect(new ExileSpellEffect()); } @@ -41,16 +39,3 @@ public final class WildestDreams extends CardImpl { return new WildestDreams(this); } } - -enum WildestDreamsAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard( - ability.getManaCostsToPay().getX(), - StaticFilters.FILTER_CARD_FROM_YOUR_GRAVEYARD - )); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/w/WindgracesJudgment.java b/Mage.Sets/src/mage/cards/w/WindgracesJudgment.java index 849be55796a..11407c6e74a 100644 --- a/Mage.Sets/src/mage/cards/w/WindgracesJudgment.java +++ b/Mage.Sets/src/mage/cards/w/WindgracesJudgment.java @@ -1,16 +1,11 @@ package mage.cards.w; -import mage.abilities.Ability; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterNonlandPermanent; -import mage.filter.predicate.permanent.ControllerIdPredicate; -import mage.game.Game; -import mage.players.Player; -import mage.target.TargetPermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.common.TargetNonlandPermanent; +import mage.target.targetadjustment.EachOpponentPermanentTargetsAdjuster; import mage.target.targetpointer.EachTargetPointer; import java.util.UUID; @@ -28,7 +23,8 @@ public final class WindgracesJudgment extends CardImpl { .setTargetPointer(new EachTargetPointer()) .setText("For any number of opponents, destroy target nonland permanent that player controls") ); - this.getSpellAbility().setTargetAdjuster(WindgracesJudgmentAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster()); + this.getSpellAbility().addTarget(new TargetNonlandPermanent(0, 1)); } private WindgracesJudgment(final WindgracesJudgment card) { @@ -40,23 +36,3 @@ public final class WindgracesJudgment extends CardImpl { return new WindgracesJudgment(this); } } - -enum WindgracesJudgmentAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - game.getOpponents(ability.getControllerId()).forEach(playerId -> { - Player player = game.getPlayer(playerId); - if (player != null) { - FilterNonlandPermanent filter = new FilterNonlandPermanent( - "nonland permanent controlled by " - + player.getLogName() - ); - filter.add(new ControllerIdPredicate(playerId)); - ability.addTarget(new TargetPermanent(0, 1, filter, false)); - } - }); - } -} diff --git a/Mage.Sets/src/mage/cards/w/WinterBlast.java b/Mage.Sets/src/mage/cards/w/WinterBlast.java index 03bbb347250..d409227dcd4 100644 --- a/Mage.Sets/src/mage/cards/w/WinterBlast.java +++ b/Mage.Sets/src/mage/cards/w/WinterBlast.java @@ -11,7 +11,7 @@ import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -26,7 +26,7 @@ public final class WinterBlast extends CardImpl { // Tap X target creatures. Winter Blast deals 2 damage to each of those creatures with flying. this.getSpellAbility().addEffect(new WinterBlastEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().setTargetAdjuster(WinterBlastAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); } private WinterBlast(final WinterBlast card) { @@ -39,16 +39,6 @@ public final class WinterBlast extends CardImpl { } } -enum WinterBlastAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX())); - } -} - class WinterBlastEffect extends OneShotEffect { WinterBlastEffect() { diff --git a/Mage.Sets/src/mage/cards/w/WordOfBinding.java b/Mage.Sets/src/mage/cards/w/WordOfBinding.java index a51127f5c7e..afbd0e89928 100644 --- a/Mage.Sets/src/mage/cards/w/WordOfBinding.java +++ b/Mage.Sets/src/mage/cards/w/WordOfBinding.java @@ -1,14 +1,12 @@ package mage.cards.w; -import mage.abilities.Ability; import mage.abilities.effects.common.TapTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.XTargetsCountAdjuster; import java.util.UUID; @@ -22,7 +20,8 @@ public final class WordOfBinding extends CardImpl { // Tap X target creatures. this.getSpellAbility().addEffect(new TapTargetEffect("tap X target creatures")); - this.getSpellAbility().setTargetAdjuster(WordOfBindingAdjuster.instance); + this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } private WordOfBinding(final WordOfBinding card) { @@ -34,13 +33,3 @@ public final class WordOfBinding extends CardImpl { return new WordOfBinding(this); } } - -enum WordOfBindingAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - ability.getTargets().clear(); - ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX())); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/z/ZethiArcaneBlademaster.java b/Mage.Sets/src/mage/cards/z/ZethiArcaneBlademaster.java index 872f067476a..1600b43f2fa 100644 --- a/Mage.Sets/src/mage/cards/z/ZethiArcaneBlademaster.java +++ b/Mage.Sets/src/mage/cards/z/ZethiArcaneBlademaster.java @@ -15,7 +15,7 @@ import mage.filter.FilterCard; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetadjustment.TargetsCountAdjuster; import org.apache.log4j.Logger; import java.util.UUID; @@ -24,6 +24,11 @@ import java.util.UUID; * @author TheElk801 */ public final class ZethiArcaneBlademaster extends CardImpl { + private static final FilterCard filter = new FilterCard("instant cards from your graveyard"); + + static { + filter.add(CardType.INSTANT.getPredicate()); + } public ZethiArcaneBlademaster(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{U}"); @@ -38,8 +43,11 @@ public final class ZethiArcaneBlademaster extends CardImpl { this.addAbility(new MultikickerAbility("{W/U}")); // When Chun-Li enters the battlefield, exile up to X target instant cards from your graveyard, where X is the number of times Chun-Li was kicked. Put a kick counter on each of them. - this.addAbility(new EntersBattlefieldTriggeredAbility(new ZethiArcaneBlademasterExileEffect()) - .setTargetAdjuster(ZethiArcaneBlademasterAdjuster.instance)); + Ability ability = new EntersBattlefieldTriggeredAbility(new ZethiArcaneBlademasterExileEffect()); + ability.setTargetAdjuster(new TargetsCountAdjuster(MultikickerCount.instance)); + ability.addTarget(new TargetCardInYourGraveyard(0, 1, filter)); + this.addAbility(ability); + // Lightning Kick—Whenever Chun-Li attacks, copy each exiled card you own with a kick counter on it. You may cast the copies. this.addAbility(new AttacksTriggeredAbility(new ZethiArcaneBlademasterCastEffect())); @@ -55,22 +63,6 @@ public final class ZethiArcaneBlademaster extends CardImpl { } } -enum ZethiArcaneBlademasterAdjuster implements TargetAdjuster { - instance; - private static final FilterCard filter = new FilterCard("instant cards from your graveyard"); - - static { - filter.add(CardType.INSTANT.getPredicate()); - } - - @Override - public void adjustTargets(Ability ability, Game game) { - int count = MultikickerCount.instance.calculate(game, ability, null); - ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard(0, count, filter)); - } -} - class ZethiArcaneBlademasterExileEffect extends OneShotEffect { ZethiArcaneBlademasterExileEffect() { diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetMonstrosityXValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetMonstrosityXValue.java new file mode 100644 index 00000000000..7446257760d --- /dev/null +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetMonstrosityXValue.java @@ -0,0 +1,41 @@ +package mage.abilities.dynamicvalue.common; + +import mage.abilities.Ability; +import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.game.Game; + + +/** + * Monstrosity X + * + * @author notgreat + */ +public enum GetMonstrosityXValue implements DynamicValue { + instance; + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + if (sourceAbility instanceof BecomesMonstrousSourceTriggeredAbility) { + return ((BecomesMonstrousSourceTriggeredAbility) sourceAbility).getMonstrosityValue(); + } else { + throw new IllegalArgumentException("Trying to get Monstrosity X value with non-Monstrosity sourceAbility "+sourceAbility.getClass().getName()); + } + } + + @Override + public GetMonstrosityXValue copy() { + return GetMonstrosityXValue.instance; + } + + @Override + public String toString() { + return "X"; + } + + @Override + public String getMessage() { + return ""; + } +} diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetScryAmount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetScryAmount.java new file mode 100644 index 00000000000..fc34ead6720 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetScryAmount.java @@ -0,0 +1,39 @@ +package mage.abilities.dynamicvalue.common; + +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.game.Game; + + +/** + * @author notgreat + */ +public enum GetScryAmount implements DynamicValue { + instance; + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + return sourceAbility + .getEffects() + .stream() + .mapToInt(thisEffect -> (Integer) thisEffect.getValue("amount")) + .findFirst() + .orElse(0); + } + + @Override + public GetScryAmount copy() { + return GetScryAmount.instance; + } + + @Override + public String getMessage() { + return "card looked at while scrying this way"; + } + + @Override + public String toString() { + return "1"; + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/TuskenRaiderToken.java b/Mage/src/main/java/mage/game/permanent/token/TuskenRaiderToken.java index da93d932a2e..79339db942d 100644 --- a/Mage/src/main/java/mage/game/permanent/token/TuskenRaiderToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/TuskenRaiderToken.java @@ -10,7 +10,7 @@ import mage.constants.SubType; public final class TuskenRaiderToken extends TokenImpl { public TuskenRaiderToken() { - super("Tusken Raider Token", "white Tusken Raider creature token"); + super("Tusken Raider Token", "1/1 white Tusken Raider creature token"); this.power = new MageInt(1); this.toughness = new MageInt(1); cardType.add(CardType.CREATURE); diff --git a/Mage/src/main/java/mage/target/targetadjustment/EachOpponentPermanentTargetsAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/EachOpponentPermanentTargetsAdjuster.java index c3dd29d2b6a..85ef6c1a2a2 100644 --- a/Mage/src/main/java/mage/target/targetadjustment/EachOpponentPermanentTargetsAdjuster.java +++ b/Mage/src/main/java/mage/target/targetadjustment/EachOpponentPermanentTargetsAdjuster.java @@ -38,7 +38,7 @@ public class EachOpponentPermanentTargetsAdjuster implements TargetAdjuster { Filter filter = newTarget.getFilter(); filter.add(new ControllerIdPredicate(opponentId)); if (!newTarget.possibleTargets(ability.getControllerId(), ability, game).isEmpty()) { - filter.setMessage(filter.getMessage() + " controlled by " + opponent.getLogName()); + newTarget.setTargetName(filter.getMessage() + " controlled by " + opponent.getLogName()); ability.addTarget(newTarget); } } diff --git a/Mage/src/main/java/mage/target/targetadjustment/ManaValueTargetAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/ManaValueTargetAdjuster.java new file mode 100644 index 00000000000..fea7a23c8fe --- /dev/null +++ b/Mage/src/main/java/mage/target/targetadjustment/ManaValueTargetAdjuster.java @@ -0,0 +1,45 @@ +package mage.target.targetadjustment; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.constants.ComparisonType; +import mage.filter.Filter; +import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.game.Game; +import mage.target.Target; + +/** + * @author TheElk801, notgreat + */ +public class ManaValueTargetAdjuster implements TargetAdjuster { + private Target blueprintTarget = null; + private final DynamicValue dynamicValue; + private final ComparisonType comparison; + + /** + * Modifies the target to also require a mana value that satisfies the comparison to the dynamic value. + * + * @param value The value to be compared against + * @param compare Which comparison to use + */ + public ManaValueTargetAdjuster(DynamicValue value, ComparisonType compare) { + this.dynamicValue = value; + this.comparison = compare; + } + + @Override + public void adjustTargets(Ability ability, Game game) { + if (blueprintTarget == null) { + blueprintTarget = ability.getTargets().get(0).copy(); + blueprintTarget.clearChosen(); + } + Target newTarget = blueprintTarget.copy(); + int amount = dynamicValue.calculate(game, ability, ability.getEffects().get(0)); + Filter filter = newTarget.getFilter(); + filter.add(new ManaValuePredicate(comparison, amount)); + newTarget.setTargetName(filter.getMessage() + " (Mana Value " + comparison + " " + amount + ")"); + ability.getTargets().clear(); + ability.addTarget(newTarget); + } +} diff --git a/Mage/src/main/java/mage/target/targetadjustment/PowerTargetAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/PowerTargetAdjuster.java new file mode 100644 index 00000000000..f67da66c1a7 --- /dev/null +++ b/Mage/src/main/java/mage/target/targetadjustment/PowerTargetAdjuster.java @@ -0,0 +1,50 @@ +package mage.target.targetadjustment; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.constants.ComparisonType; +import mage.filter.Filter; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.game.Game; +import mage.target.Target; + +/** + * @author TheElk801, notgreat + */ +public class PowerTargetAdjuster implements TargetAdjuster { + private Target blueprintTarget = null; + private final DynamicValue dynamicValue; + private final ComparisonType comparison; + + /** + * Modifies the target to also require a power that satisfies the comparison to the dynamic value. + * + * @param value The value to be compared against + * @param compare Which comparison to use + */ + public PowerTargetAdjuster(DynamicValue value, ComparisonType compare) { + this.dynamicValue = value; + this.comparison = compare; + } + + public PowerTargetAdjuster(ComparisonType comparison) { + this(ManacostVariableValue.REGULAR, comparison); + } + + @Override + public void adjustTargets(Ability ability, Game game) { + if (blueprintTarget == null) { + blueprintTarget = ability.getTargets().get(0).copy(); + blueprintTarget.clearChosen(); + } + Target newTarget = blueprintTarget.copy(); + int amount = dynamicValue.calculate(game, ability, ability.getEffects().get(0)); + Filter filter = newTarget.getFilter(); + filter.add(new PowerPredicate(comparison, amount)); + newTarget.setTargetName(filter.getMessage() + " (Power " + comparison + " " + amount + ")"); + ability.getTargets().clear(); + ability.addTarget(newTarget); + } +} diff --git a/Mage/src/main/java/mage/target/targetadjustment/TargetsCountAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/TargetsCountAdjuster.java new file mode 100644 index 00000000000..8e0ad370b8b --- /dev/null +++ b/Mage/src/main/java/mage/target/targetadjustment/TargetsCountAdjuster.java @@ -0,0 +1,48 @@ +package mage.target.targetadjustment; + +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.filter.Filter; +import mage.game.Game; +import mage.target.Target; + +/** + * @author TheElk801, notgreat + */ +public class TargetsCountAdjuster implements TargetAdjuster { + private Target blueprintTarget = null; + private final DynamicValue dynamicValue; + + /** + * Modifies the target to be X targets, where X is the dynamic value. + * If the ability's target has min targets of 0, it's treated as "up to X targets". + * Otherwise, it's exactly "X targets". + * + * @param value The number of targets + */ + public TargetsCountAdjuster(DynamicValue value) { + this.dynamicValue = value; + } + + @Override + public void adjustTargets(Ability ability, Game game) { + if (blueprintTarget == null) { + blueprintTarget = ability.getTargets().get(0).copy(); + blueprintTarget.clearChosen(); + } + Target newTarget = blueprintTarget.copy(); + int count = dynamicValue.calculate(game, ability, ability.getEffects().get(0)); + newTarget.setMaxNumberOfTargets(count); + Filter filter = newTarget.getFilter(); + if (blueprintTarget.getMinNumberOfTargets() != 0) { + newTarget.setMinNumberOfTargets(count); + newTarget.setTargetName(filter.getMessage() + " (" + count + " targets)"); + } else { + newTarget.setTargetName(filter.getMessage() + " (up to " + count + " targets)"); + } + ability.getTargets().clear(); + if (count > 0) { + ability.addTarget(newTarget); + } + } +} diff --git a/Mage/src/main/java/mage/target/targetadjustment/ToughnessTargetAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/ToughnessTargetAdjuster.java new file mode 100644 index 00000000000..d0ede2bac13 --- /dev/null +++ b/Mage/src/main/java/mage/target/targetadjustment/ToughnessTargetAdjuster.java @@ -0,0 +1,50 @@ +package mage.target.targetadjustment; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.constants.ComparisonType; +import mage.filter.Filter; +import mage.filter.predicate.mageobject.ToughnessPredicate; +import mage.game.Game; +import mage.target.Target; + +/** + * @author TheElk801, notgreat + */ +public class ToughnessTargetAdjuster implements TargetAdjuster { + private Target blueprintTarget = null; + private final DynamicValue dynamicValue; + private final ComparisonType comparison; + + /** + * Modifies the target to also require a toughness that satisfies the comparison to the dynamic value. + * + * @param value The value to be compared against + * @param compare Which comparison to use + */ + public ToughnessTargetAdjuster(DynamicValue value, ComparisonType compare) { + this.dynamicValue = value; + this.comparison = compare; + } + + public ToughnessTargetAdjuster(ComparisonType comparison) { + this(ManacostVariableValue.REGULAR, comparison); + } + + @Override + public void adjustTargets(Ability ability, Game game) { + if (blueprintTarget == null) { + blueprintTarget = ability.getTargets().get(0).copy(); + blueprintTarget.clearChosen(); + } + Target newTarget = blueprintTarget.copy(); + int amount = dynamicValue.calculate(game, ability, ability.getEffects().get(0)); + Filter filter = newTarget.getFilter(); + filter.add(new ToughnessPredicate(comparison, amount)); + newTarget.setTargetName(filter.getMessage() + " (Toughness " + comparison + " " + amount + ")"); + ability.getTargets().clear(); + ability.addTarget(newTarget); + } +} diff --git a/Mage/src/main/java/mage/target/targetadjustment/VerseCounterAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/VerseCounterAdjuster.java deleted file mode 100644 index 35d14577853..00000000000 --- a/Mage/src/main/java/mage/target/targetadjustment/VerseCounterAdjuster.java +++ /dev/null @@ -1,27 +0,0 @@ -package mage.target.targetadjustment; - -import mage.abilities.Ability; -import mage.counters.CounterType; -import mage.filter.FilterPermanent; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.target.TargetPermanent; - -/** - * - * @author TheElk801 - */ -public enum VerseCounterAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(ability.getSourceId()); - if (sourcePermanent != null) { - int xValue = sourcePermanent.getCounters(game).getCount(CounterType.VERSE); - FilterPermanent permanentFilter = ((TargetPermanent) ability.getTargets().get(0)).getFilter(); - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(0, xValue, permanentFilter, false)); - } - } -} diff --git a/Mage/src/main/java/mage/target/targetadjustment/XCMCGraveyardAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/XCMCGraveyardAdjuster.java deleted file mode 100644 index 57f86272ee9..00000000000 --- a/Mage/src/main/java/mage/target/targetadjustment/XCMCGraveyardAdjuster.java +++ /dev/null @@ -1,27 +0,0 @@ -package mage.target.targetadjustment; - -import mage.abilities.Ability; -import mage.constants.ComparisonType; -import mage.filter.FilterCard; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; -import mage.target.TargetCard; -import mage.target.common.TargetCardInGraveyard; - -/** - * - * @author TheElk801 - */ -public enum XCMCGraveyardAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - FilterCard filterCard = ((TargetCard) ability.getTargets().get(0)).getFilter().copy(); - filterCard.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - filterCard.setMessage(filterCard.getMessage().replace('X', (char) xValue)); - ability.getTargets().clear(); - ability.getTargets().add(new TargetCardInGraveyard(filterCard)); - } -} diff --git a/Mage/src/main/java/mage/target/targetadjustment/XCMCPermanentAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/XCMCPermanentAdjuster.java deleted file mode 100644 index a23d9e12133..00000000000 --- a/Mage/src/main/java/mage/target/targetadjustment/XCMCPermanentAdjuster.java +++ /dev/null @@ -1,28 +0,0 @@ -package mage.target.targetadjustment; - -import mage.abilities.Ability; -import mage.constants.ComparisonType; -import mage.filter.FilterPermanent; -import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; -import mage.target.TargetPermanent; - -/** - * - * @author TheElk801 - */ -public enum XCMCPermanentAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - TargetPermanent oldTargetPermanent = (TargetPermanent) ability.getTargets().get(0); - int minTargets = oldTargetPermanent.getMinNumberOfTargets(); - int maxTargets = oldTargetPermanent.getMaxNumberOfTargets(); - FilterPermanent permanentFilter = oldTargetPermanent.getFilter().copy(); - permanentFilter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); - ability.getTargets().clear(); - ability.getTargets().add(new TargetPermanent(minTargets, maxTargets, permanentFilter, false)); - } -} diff --git a/Mage/src/main/java/mage/target/targetadjustment/XManaValueTargetAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/XManaValueTargetAdjuster.java new file mode 100644 index 00000000000..e529f369237 --- /dev/null +++ b/Mage/src/main/java/mage/target/targetadjustment/XManaValueTargetAdjuster.java @@ -0,0 +1,18 @@ +package mage.target.targetadjustment; + +import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.constants.ComparisonType; + +/** + * @author notgreat + */ +public class XManaValueTargetAdjuster extends ManaValueTargetAdjuster { + + public XManaValueTargetAdjuster() { + super(ManacostVariableValue.REGULAR, ComparisonType.EQUAL_TO); + } + + public XManaValueTargetAdjuster(ComparisonType comparison) { + super(ManacostVariableValue.REGULAR, comparison); + } +} diff --git a/Mage/src/main/java/mage/target/targetadjustment/XTargetsAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/XTargetsAdjuster.java deleted file mode 100644 index c95f3fbbe22..00000000000 --- a/Mage/src/main/java/mage/target/targetadjustment/XTargetsAdjuster.java +++ /dev/null @@ -1,22 +0,0 @@ -package mage.target.targetadjustment; - -import mage.abilities.Ability; -import mage.filter.FilterPermanent; -import mage.game.Game; -import mage.target.TargetPermanent; - -/** - * - * @author TheElk801 - */ -public enum XTargetsAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); - FilterPermanent permanentFilter = ((TargetPermanent) ability.getTargets().get(0)).getFilter(); - ability.getTargets().clear(); - ability.addTarget(new TargetPermanent(xValue, permanentFilter)); - } -} diff --git a/Mage/src/main/java/mage/target/targetadjustment/XTargetsCountAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/XTargetsCountAdjuster.java new file mode 100644 index 00000000000..3a471890132 --- /dev/null +++ b/Mage/src/main/java/mage/target/targetadjustment/XTargetsCountAdjuster.java @@ -0,0 +1,13 @@ +package mage.target.targetadjustment; + +import mage.abilities.dynamicvalue.common.ManacostVariableValue; + +/** + * @author notgreat + */ +public class XTargetsCountAdjuster extends TargetsCountAdjuster { + + public XTargetsCountAdjuster() { + super(ManacostVariableValue.REGULAR); + } +}