Genericize Target Adjusters (#12107)

* Create generic X MV adjuster

* Update XTargetsAdjuster

* Create DynamicValueTargetsAdjuster to replace VerseCounterAdjuster

* Convert XTargetsAdjuster to use DynamicValueTargetsAdjuster

* Genericize MV target adjuster

* Converting custom classes for A and B cards, fix Back in Town to only target creature cards

* Add Power and Toughness target adjusters, C cards

* Set up and use Monstrosity X DynamicValue

* Move Scry amount dynamic value to common, add D and E cards

* Convert F to I cards

* Cards K-M

* N, O cards

* Cards O-R

* S cards (check Scrap Welder)

* Cards T - Z

* Rename target adjusters

* Add filter messages, don't add 0 count targets

* Clear blueprint targets (just in case), fix target names, Temporal Firestorm is not target

* Requested renames

* Aether Burst is "up to"

* Review fixes

* Add new cards, add source to dynamic value calculation
This commit is contained in:
ssk97 2024-05-02 22:12:52 -07:00 committed by GitHub
parent 5e8aee48b3
commit 32bf3eb9bf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
161 changed files with 949 additions and 2567 deletions

View file

@ -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);
}
}

View file

@ -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);
}

View file

@ -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));
}
}
}

View file

@ -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);
}

View file

@ -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));
}
}

View file

@ -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));
}
}

View file

@ -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);
}
}

View file

@ -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));
}
}

View file

@ -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));
}
}

View file

@ -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);
}
}

View file

@ -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));
}
}

View file

@ -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() {

View file

@ -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));
}
}

View file

@ -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);
}

View file

@ -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";
}
}

View file

@ -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));
}
}
}
}

View file

@ -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() {

View file

@ -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));
}
}

View file

@ -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() {

View file

@ -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()));
}
}

View file

@ -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() {

View file

@ -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 "";
}
}

View file

@ -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);
}
}

View file

@ -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() {

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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));
}
}

View file

@ -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));
}
}

View file

@ -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() {

View file

@ -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);
}
}

View file

@ -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));
}
}

View file

@ -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() {

View file

@ -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));
}
}

View file

@ -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));
}
}

View file

@ -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));
}
}

View file

@ -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));
}
}

View file

@ -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));
}
}
}

View file

@ -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));
}
}

View file

@ -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));
}
}

View file

@ -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));
}
}

View file

@ -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);
}
}

View file

@ -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() {

View file

@ -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() {

View file

@ -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() {

View file

@ -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));
}
}

View file

@ -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);
}

View file

@ -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()));
}
}

View file

@ -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));
}
}

View file

@ -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);
}

View file

@ -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));
}
}

View file

@ -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);
}

View file

@ -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() {

View file

@ -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("<br/><i>Ferocious</i> &mdash; 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()));
}
}

View file

@ -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() {

View file

@ -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() {

View file

@ -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() {

View file

@ -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));
}
}

View file

@ -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);

View file

@ -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));
}
}

View file

@ -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));
}
}
}

View file

@ -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;
}

View file

@ -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));
}
}

View file

@ -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.

View file

@ -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() {

View file

@ -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<Permanent> {
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));
}
}

View file

@ -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);
}

View file

@ -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));
}
}

View file

@ -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<Card> {

View file

@ -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));
}
}

View file

@ -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()));
}
}

View file

@ -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));
}
}
}

View file

@ -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");

View file

@ -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()));
}
}

View file

@ -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));
}
}
}

View file

@ -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);
}
}
}

View file

@ -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<Permanent> {
instance;

View file

@ -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() {

View file

@ -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));
}
}

View file

@ -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);
}

View file

@ -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));
}
}
}

View file

@ -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));
}
}

View file

@ -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));
}
}
}

View file

@ -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
));
}
}

View file

@ -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()));
}
}

View file

@ -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() {

View file

@ -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() {

View file

@ -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()));
}
}

View file

@ -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
));
}
}

View file

@ -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);
}

View file

@ -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() {

View file

@ -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) {

View file

@ -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));
}
}
}

View file

@ -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));
}
}

View file

@ -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));
}
}

View file

@ -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) {

View file

@ -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);
}

View file

@ -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() {

View file

@ -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()));
}
}

View file

@ -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("<br>"));
@ -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));
}
}

View file

@ -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);
}
}

Some files were not shown because too many files have changed in this diff Show more