mirror of
https://github.com/magefree/mage.git
synced 2026-01-23 11:49:56 -08:00
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:
parent
5e8aee48b3
commit
32bf3eb9bf
161 changed files with 949 additions and 2567 deletions
|
|
@ -1,20 +1,16 @@
|
||||||
|
|
||||||
package mage.cards.a;
|
package mage.cards.a;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.dynamicvalue.IntPlusDynamicValue;
|
||||||
import mage.abilities.Mode;
|
import mage.abilities.dynamicvalue.common.CardsInAllGraveyardsCount;
|
||||||
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.FilterCard;
|
||||||
import mage.filter.StaticFilters;
|
|
||||||
import mage.filter.predicate.mageobject.NamePredicate;
|
import mage.filter.predicate.mageobject.NamePredicate;
|
||||||
import mage.game.Game;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.players.Player;
|
import mage.target.targetadjustment.TargetsCountAdjuster;
|
||||||
import mage.target.Target;
|
|
||||||
import mage.target.TargetPermanent;
|
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -22,13 +18,18 @@ import java.util.UUID;
|
||||||
* @author magenoxx_at_gmail.com
|
* @author magenoxx_at_gmail.com
|
||||||
*/
|
*/
|
||||||
public final class AetherBurst extends CardImpl {
|
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) {
|
public AetherBurst(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}");
|
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.
|
// 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().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().addTarget(new TargetCreaturePermanent(0, 1));
|
||||||
this.getSpellAbility().setTargetAdjuster(AetherBurstAdjuster.instance);
|
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);
|
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.a;
|
package mage.cards.a;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.costs.CostAdjuster;
|
import mage.abilities.costs.CostAdjuster;
|
||||||
|
|
@ -16,7 +15,9 @@ import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.target.common.TargetCardInHand;
|
import mage.target.common.TargetCardInHand;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
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");
|
effect.setText("Return X target creatures to their owners' hands");
|
||||||
this.getSpellAbility().addEffect(effect);
|
this.getSpellAbility().addEffect(effect);
|
||||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||||
this.getSpellAbility().setTargetAdjuster(XTargetsAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
this.getSpellAbility().setCostAdjuster(AetherTideCostAdjuster.instance);
|
this.getSpellAbility().setCostAdjuster(AetherTideCostAdjuster.instance);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,9 +21,8 @@ import mage.filter.common.FilterControlledPermanent;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
import mage.filter.predicate.Predicates;
|
import mage.filter.predicate.Predicates;
|
||||||
import mage.filter.predicate.mageobject.AbilityPredicate;
|
import mage.filter.predicate.mageobject.AbilityPredicate;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetControlledCreaturePermanent;
|
import mage.target.common.TargetControlledCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.TargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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, "
|
.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"));
|
+ "where X is the number of Bobbleheads you control as you activate this ability"));
|
||||||
ability.addTarget(new TargetControlledCreaturePermanent(0, 0));
|
ability.addTarget(new TargetControlledCreaturePermanent(0, 0));
|
||||||
ability.setTargetAdjuster(new AgilityBobbleheadAdjuster(xValue));
|
ability.setTargetAdjuster(new TargetsCountAdjuster(xValue));
|
||||||
ability.addHint(hint);
|
ability.addHint(hint);
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
@ -75,21 +74,3 @@ public final class AgilityBobblehead extends CardImpl {
|
||||||
return new AgilityBobblehead(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.a;
|
package mage.cards.a;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
|
@ -15,11 +14,12 @@ import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.SuperType;
|
import mage.constants.SuperType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.FilterCard;
|
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.common.TargetCardInHand;
|
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 TapSourceCost());
|
||||||
ability.addCost(new DiscardTargetCost(new TargetCardInHand(2, StaticFilters.FILTER_CARD_CARDS)));
|
ability.addCost(new DiscardTargetCost(new TargetCardInHand(2, StaticFilters.FILTER_CARD_CARDS)));
|
||||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_CREATURES));
|
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_CREATURES));
|
||||||
ability.setTargetAdjuster(XTargetsAdjuster.instance);
|
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,9 +11,8 @@ import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.TargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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."
|
"tap up to X target creatures, where X is the number of times this creature has mutated."
|
||||||
));
|
));
|
||||||
ability.addEffect(new DontUntapInControllersNextUntapStepTargetEffect("Those creatures"));
|
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);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -50,14 +50,3 @@ public final class Archipelagore extends CardImpl {
|
||||||
return new Archipelagore(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -3,7 +3,6 @@ package mage.cards.a;
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.costs.VariableCost;
|
|
||||||
import mage.abilities.costs.common.TapSourceCost;
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
import mage.abilities.costs.common.TapVariableTargetCost;
|
import mage.abilities.costs.common.TapVariableTargetCost;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
|
|
@ -14,13 +13,10 @@ import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
import mage.filter.common.FilterControlledPermanent;
|
import mage.filter.common.FilterControlledPermanent;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
|
||||||
import mage.filter.predicate.mageobject.PowerPredicate;
|
|
||||||
import mage.filter.predicate.permanent.TappedPredicate;
|
import mage.filter.predicate.permanent.TappedPredicate;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.permanent.token.KnightToken;
|
import mage.game.permanent.token.KnightToken;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.PowerTargetAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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}"));
|
.setText("Destroy target creature with power X or less"), new ManaCostsImpl<>("{B}"));
|
||||||
ability.addCost(new TapSourceCost());
|
ability.addCost(new TapSourceCost());
|
||||||
ability.addCost(new TapVariableTargetCost(filter));
|
ability.addCost(new TapVariableTargetCost(filter));
|
||||||
ability.setTargetAdjuster(AryelKnightOfWindgraceAdjuster.instance);
|
ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS));
|
||||||
|
ability.addTarget(new TargetCreaturePermanent());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -71,19 +68,3 @@ public final class AryelKnightOfWindgrace extends CardImpl {
|
||||||
return new AryelKnightOfWindgrace(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -18,10 +18,8 @@ import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.Target;
|
|
||||||
import mage.target.common.TargetCardInGraveyardBattlefieldOrStack;
|
import mage.target.common.TargetCardInGraveyardBattlefieldOrStack;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.TargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// 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()
|
Ability ability = new TurnedFaceUpSourceTriggeredAbility(new ExileTargetForSourceEffect()
|
||||||
.setText("exile up to X other target creatures from the battlefield and/or creature cards from graveyards"));
|
.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);
|
this.addAbility(ability);
|
||||||
|
|
||||||
// When Aurelia's Vindicator leaves the battlefield, return the exiled cards to their owners' hands.
|
// 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);
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
package mage.cards.a;
|
package mage.cards.a;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
||||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
|
@ -9,9 +9,8 @@ import mage.constants.CardType;
|
||||||
import mage.constants.SuperType;
|
import mage.constants.SuperType;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.filter.common.FilterLandPermanent;
|
import mage.filter.common.FilterLandPermanent;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.TargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -19,13 +18,20 @@ import java.util.UUID;
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class Avalanche extends CardImpl {
|
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) {
|
public Avalanche(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{2}{R}{R}");
|
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{2}{R}{R}");
|
||||||
|
|
||||||
// Destroy X target snow lands.
|
// Destroy X target snow lands.
|
||||||
this.getSpellAbility().addEffect(new DestroyTargetEffect("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) {
|
private Avalanche(final Avalanche card) {
|
||||||
|
|
@ -37,19 +43,3 @@ public final class Avalanche extends CardImpl {
|
||||||
return new Avalanche(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,15 +1,15 @@
|
||||||
package mage.cards.b;
|
package mage.cards.b;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
||||||
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
|
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.FilterCard;
|
||||||
|
import mage.filter.common.FilterCreatureCard;
|
||||||
import mage.filter.predicate.mageobject.OutlawPredicate;
|
import mage.filter.predicate.mageobject.OutlawPredicate;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.TargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -17,6 +17,11 @@ import java.util.UUID;
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class BackInTown extends CardImpl {
|
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) {
|
public BackInTown(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{2}{B}");
|
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.
|
// Return X target outlaw creature cards from your graveyard to the battlefield.
|
||||||
this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()
|
this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()
|
||||||
.setText("return X target outlaw creature cards from your graveyard to the battlefield"));
|
.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) {
|
private BackInTown(final BackInTown card) {
|
||||||
|
|
@ -36,18 +42,3 @@ public final class BackInTown extends CardImpl {
|
||||||
return new BackInTown(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,18 @@
|
||||||
|
|
||||||
package mage.cards.b;
|
package mage.cards.b;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility;
|
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.effects.common.CreateTokenEffect;
|
||||||
import mage.abilities.keyword.MonstrosityAbility;
|
import mage.abilities.keyword.MonstrosityAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.permanent.token.TuskenRaiderToken;
|
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));
|
this.addAbility(new MonstrosityAbility("{X}{W}{W}", Integer.MAX_VALUE));
|
||||||
|
|
||||||
// When Batha Herd becomes monstrous, create X 1/1 white Tusken Raider tokens.
|
// 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) {
|
private BanthaHerd(final BanthaHerd card) {
|
||||||
|
|
@ -45,32 +42,3 @@ public final class BanthaHerd extends CardImpl {
|
||||||
return new BanthaHerd(this);
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -10,12 +10,9 @@ import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
import mage.constants.ComparisonType;
|
||||||
import mage.constants.Duration;
|
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.game.Game;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -34,7 +31,8 @@ public final class BlueSunsTwilight extends CardImpl {
|
||||||
new CreateTokenCopyTargetEffect(), BlueSunsTwilightCondition.instance,
|
new CreateTokenCopyTargetEffect(), BlueSunsTwilightCondition.instance,
|
||||||
"If X is 5 or more, create a token that's a copy of that creature"
|
"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) {
|
private BlueSunsTwilight(final BlueSunsTwilight card) {
|
||||||
|
|
@ -55,16 +53,3 @@ enum BlueSunsTwilightCondition implements Condition {
|
||||||
return source.getManaCostsToPay().getX() >= 5;
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetArtifactPermanent;
|
import mage.target.common.TargetArtifactPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
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.
|
// 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().addTarget(new TargetArtifactPermanent());
|
||||||
this.getSpellAbility().addEffect(new BuildersBaneEffect());
|
this.getSpellAbility().addEffect(new BuildersBaneEffect());
|
||||||
this.getSpellAbility().setTargetAdjuster(BuildersBaneAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
}
|
}
|
||||||
|
|
||||||
private BuildersBane(final BuildersBane card) {
|
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 {
|
class BuildersBaneEffect extends OneShotEffect {
|
||||||
|
|
||||||
BuildersBaneEffect() {
|
BuildersBaneEffect() {
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,12 @@
|
||||||
|
|
||||||
package mage.cards.b;
|
package mage.cards.b;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetArtifactPermanent;
|
import mage.target.common.TargetArtifactPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -23,7 +21,7 @@ public final class ByForce extends CardImpl {
|
||||||
// Destroy X target artifacts.
|
// Destroy X target artifacts.
|
||||||
this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target artifacts"));
|
this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target artifacts"));
|
||||||
this.getSpellAbility().addTarget(new TargetArtifactPermanent());
|
this.getSpellAbility().addTarget(new TargetArtifactPermanent());
|
||||||
this.getSpellAbility().setTargetAdjuster(ByForceAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
}
|
}
|
||||||
|
|
||||||
private ByForce(final ByForce card) {
|
private ByForce(final ByForce card) {
|
||||||
|
|
@ -35,14 +33,3 @@ public final class ByForce extends CardImpl {
|
||||||
return new ByForce(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.c;
|
package mage.cards.c;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.costs.common.TapSourceCost;
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
|
|
@ -13,7 +12,9 @@ import mage.constants.CardType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.target.TargetPermanent;
|
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 ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{X}"));
|
||||||
ability.addCost(new TapSourceCost());
|
ability.addCost(new TapSourceCost());
|
||||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS));
|
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS));
|
||||||
ability.setTargetAdjuster(XTargetsAdjuster.instance);
|
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,9 @@
|
||||||
package mage.cards.c;
|
package mage.cards.c;
|
||||||
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.AttacksWithCreaturesTriggeredAbility;
|
import mage.abilities.common.AttacksWithCreaturesTriggeredAbility;
|
||||||
import mage.abilities.common.ScryTriggeredAbility;
|
import mage.abilities.common.ScryTriggeredAbility;
|
||||||
import mage.abilities.dynamicvalue.DynamicValue;
|
import mage.abilities.dynamicvalue.common.GetScryAmount;
|
||||||
import mage.abilities.effects.Effect;
|
|
||||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||||
import mage.abilities.effects.keyword.ScryEffect;
|
import mage.abilities.effects.keyword.ScryEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
|
|
@ -15,7 +13,6 @@ import mage.constants.Duration;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.SuperType;
|
import mage.constants.SuperType;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.game.Game;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// 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(
|
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);
|
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";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.costs.common.SacrificeXTargetCost;
|
import mage.abilities.costs.common.SacrificeXTargetCost;
|
||||||
import mage.abilities.costs.common.TapSourceCost;
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
import mage.abilities.dynamicvalue.common.GetXValue;
|
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.common.PutOnLibrarySourceEffect;
|
import mage.abilities.effects.common.PutOnLibrarySourceEffect;
|
||||||
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
|
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
|
||||||
|
|
@ -18,9 +17,8 @@ import mage.constants.Zone;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||||
import mage.filter.predicate.mageobject.AnotherPredicate;
|
import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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 ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{3}{B}{B}"));
|
||||||
ability.addCost(new TapSourceCost());
|
ability.addCost(new TapSourceCost());
|
||||||
ability.addCost(new SacrificeXTargetCost(filter));
|
ability.addCost(new SacrificeXTargetCost(filter));
|
||||||
ability.addTarget(new TargetCardInYourGraveyard(0, Integer.MAX_VALUE, StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD));
|
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD));
|
||||||
ability.setTargetAdjuster(ChampionOfStraySoulsAdjuster.instance);
|
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
|
|
||||||
// {5}{B}{B}: Put Champion of Stray Souls on top of your library from your graveyard.
|
// {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);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.common.TargetControlledCreaturePermanent;
|
import mage.target.common.TargetControlledCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
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.
|
// Each of X target creatures you control connive. You may have any number of them phase out.
|
||||||
this.getSpellAbility().addEffect(new ChangeOfPlansEffect());
|
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) {
|
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 {
|
class ChangeOfPlansEffect extends OneShotEffect {
|
||||||
|
|
||||||
ChangeOfPlansEffect() {
|
ChangeOfPlansEffect() {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.c;
|
package mage.cards.c;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.CastOnlyDuringPhaseStepSourceAbility;
|
import mage.abilities.common.CastOnlyDuringPhaseStepSourceAbility;
|
||||||
import mage.abilities.effects.common.BecomeBlockedTargetEffect;
|
import mage.abilities.effects.common.BecomeBlockedTargetEffect;
|
||||||
import mage.abilities.effects.common.DamageTargetEffect;
|
import mage.abilities.effects.common.DamageTargetEffect;
|
||||||
|
|
@ -9,9 +8,8 @@ import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.PhaseStep;
|
import mage.constants.PhaseStep;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -32,7 +30,8 @@ public final class ChokingVines extends CardImpl {
|
||||||
.setText("X target attacking creatures become blocked."));
|
.setText("X target attacking creatures become blocked."));
|
||||||
this.getSpellAbility().addEffect(new DamageTargetEffect(1)
|
this.getSpellAbility().addEffect(new DamageTargetEffect(1)
|
||||||
.setText("{this} deals 1 damage to each of those creatures"));
|
.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) {
|
private ChokingVines(final ChokingVines card) {
|
||||||
|
|
@ -44,14 +43,3 @@ public final class ChokingVines extends CardImpl {
|
||||||
return new ChokingVines(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package mage.cards.c;
|
package mage.cards.c;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.dynamicvalue.IntPlusDynamicValue;
|
||||||
import mage.abilities.dynamicvalue.common.MultikickerCount;
|
import mage.abilities.dynamicvalue.common.MultikickerCount;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.keyword.MultikickerAbility;
|
import mage.abilities.keyword.MultikickerAbility;
|
||||||
|
|
@ -12,7 +13,7 @@ import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetAnyTarget;
|
import mage.target.common.TargetAnyTarget;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.TargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// 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().addEffect(new CometStormEffect());
|
||||||
this.getSpellAbility().addTarget(new TargetAnyTarget(1));
|
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) {
|
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 {
|
class CometStormEffect extends OneShotEffect {
|
||||||
|
|
||||||
CometStormEffect() {
|
CometStormEffect() {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.c;
|
package mage.cards.c;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.dynamicvalue.DynamicValue;
|
import mage.abilities.dynamicvalue.DynamicValue;
|
||||||
import mage.abilities.dynamicvalue.MultipliedValue;
|
import mage.abilities.dynamicvalue.MultipliedValue;
|
||||||
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
||||||
|
|
@ -8,9 +7,8 @@ import mage.abilities.effects.common.DamageTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetAnyTarget;
|
import mage.target.common.TargetAnyTarget;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -28,7 +26,8 @@ public final class CrackleWithPower extends CardImpl {
|
||||||
this.getSpellAbility().addEffect(
|
this.getSpellAbility().addEffect(
|
||||||
new DamageTargetEffect(value).setText("{this} deals five times X damage to each of up to X targets")
|
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) {
|
private CrackleWithPower(final CrackleWithPower card) {
|
||||||
|
|
@ -40,13 +39,3 @@ public final class CrackleWithPower extends CardImpl {
|
||||||
return new CrackleWithPower(this);
|
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()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -2,25 +2,21 @@ package mage.cards.c;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.*;
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
|
import mage.game.permanent.PermanentToken;
|
||||||
import mage.game.permanent.token.Boar2Token;
|
import mage.game.permanent.token.Boar2Token;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import mage.cards.Card;
|
|
||||||
import mage.cards.Cards;
|
|
||||||
import mage.cards.CardsImpl;
|
|
||||||
import mage.game.permanent.PermanentToken;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
|
|
@ -34,7 +30,8 @@ public final class CurseOfTheSwine extends CardImpl {
|
||||||
this.getSpellAbility().addEffect(new CurseOfTheSwineEffect());
|
this.getSpellAbility().addEffect(new CurseOfTheSwineEffect());
|
||||||
|
|
||||||
// Correct number of targets will be set in adjustTargets
|
// 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 {
|
class CurseOfTheSwineEffect extends OneShotEffect {
|
||||||
|
|
||||||
CurseOfTheSwineEffect() {
|
CurseOfTheSwineEffect() {
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ package mage.cards.c;
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.AttacksTriggeredAbility;
|
import mage.abilities.common.AttacksTriggeredAbility;
|
||||||
|
import mage.abilities.dynamicvalue.DynamicValue;
|
||||||
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
|
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
|
||||||
import mage.abilities.keyword.MeleeAbility;
|
import mage.abilities.keyword.MeleeAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
|
|
@ -12,15 +14,11 @@ import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
import mage.constants.ComparisonType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.WatcherScope;
|
import mage.constants.WatcherScope;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.common.FilterCreatureCard;
|
|
||||||
import mage.filter.predicate.Predicates;
|
|
||||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
import mage.game.permanent.Permanent;
|
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.ManaValueTargetAdjuster;
|
||||||
import mage.watchers.Watcher;
|
import mage.watchers.Watcher;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
@ -29,7 +27,6 @@ import java.util.*;
|
||||||
* @author L_J
|
* @author L_J
|
||||||
*/
|
*/
|
||||||
public final class CustodiSoulcaller extends CardImpl {
|
public final class CustodiSoulcaller extends CardImpl {
|
||||||
|
|
||||||
public CustodiSoulcaller(UUID ownerId, CardSetInfo setInfo) {
|
public CustodiSoulcaller(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{W}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{W}");
|
||||||
this.subtype.add(SubType.HUMAN);
|
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.
|
// 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 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.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);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -57,21 +55,26 @@ public final class CustodiSoulcaller extends CardImpl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum CustodiSoulcallerAdjuster implements TargetAdjuster {
|
enum CustodiSoulcallerValue implements DynamicValue {
|
||||||
instance;
|
instance;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void adjustTargets(Ability ability, Game game) {
|
public int calculate(Game game, Ability sourceAbility, Effect effect) {
|
||||||
ability.getTargets().clear();
|
|
||||||
CustodiSoulcallerWatcher watcher = game.getState().getWatcher(CustodiSoulcallerWatcher.class);
|
CustodiSoulcallerWatcher watcher = game.getState().getWatcher(CustodiSoulcallerWatcher.class);
|
||||||
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(ability.getSourceId());
|
|
||||||
if (watcher != null) {
|
if (watcher != null) {
|
||||||
int xValue = watcher.getNumberOfAttackedPlayers(sourcePermanent.getControllerId());
|
return watcher.getNumberOfAttackedPlayers(sourceAbility.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 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DynamicValue copy() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMessage() {
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,15 @@
|
||||||
|
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
|
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.filter.common.FilterCreatureCard;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.Target;
|
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -29,7 +26,8 @@ public final class DeathDenied extends CardImpl {
|
||||||
Effect effect = new ReturnFromGraveyardToHandTargetEffect();
|
Effect effect = new ReturnFromGraveyardToHandTargetEffect();
|
||||||
effect.setText("Return X target creature cards from your graveyard to your hand");
|
effect.setText("Return X target creature cards from your graveyard to your hand");
|
||||||
this.getSpellAbility().addEffect(effect);
|
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) {
|
private DeathDenied(final DeathDenied card) {
|
||||||
|
|
@ -41,15 +39,3 @@ public final class DeathDenied extends CardImpl {
|
||||||
return new DeathDenied(this);
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.TriggeredAbilityImpl;
|
import mage.abilities.TriggeredAbilityImpl;
|
||||||
import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility;
|
import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility;
|
||||||
|
import mage.abilities.dynamicvalue.common.GetMonstrosityXValue;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.combat.GoadTargetEffect;
|
import mage.abilities.effects.common.combat.GoadTargetEffect;
|
||||||
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||||
|
|
@ -19,7 +20,7 @@ import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.TargetsCountAdjuster;
|
||||||
import mage.target.targetpointer.FixedTarget;
|
import mage.target.targetpointer.FixedTarget;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
@ -44,9 +45,12 @@ public final class DeathKiss extends CardImpl {
|
||||||
this.addAbility(new MonstrosityAbility("{X}{X}{R}", Integer.MAX_VALUE));
|
this.addAbility(new MonstrosityAbility("{X}{X}{R}", Integer.MAX_VALUE));
|
||||||
|
|
||||||
// When Death Kiss becomes monstrous, goad up to X target creatures your opponents control.
|
// 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")
|
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) {
|
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 {
|
class DeathKissAdjusterTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
|
|
||||||
DeathKissAdjusterTriggeredAbility() {
|
DeathKissAdjusterTriggeredAbility() {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
|
@ -14,7 +13,9 @@ import mage.constants.Zone;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.filter.predicate.Predicates;
|
import mage.filter.predicate.Predicates;
|
||||||
import mage.target.TargetPermanent;
|
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.
|
// {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 ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl<>("{X}{X}{1}"));
|
||||||
ability.addTarget(new TargetPermanent(filter));
|
ability.addTarget(new TargetPermanent(filter));
|
||||||
ability.setTargetAdjuster(XCMCPermanentAdjuster.instance);
|
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
|
@ -10,22 +9,23 @@ import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
import mage.abilities.effects.ContinuousEffect;
|
import mage.abilities.effects.ContinuousEffect;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect;
|
import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect;
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
|
import mage.constants.SubType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.Target;
|
import mage.target.Target;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.targetadjustment.XTargetsAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
import mage.target.targetpointer.FixedTarget;
|
import mage.target.targetpointer.FixedTarget;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class DeepwoodElder extends CardImpl {
|
public final class DeepwoodElder extends CardImpl {
|
||||||
|
|
@ -43,7 +43,7 @@ public final class DeepwoodElder extends CardImpl {
|
||||||
ability.addCost(new TapSourceCost());
|
ability.addCost(new TapSourceCost());
|
||||||
ability.addCost(new DiscardCardCost());
|
ability.addCost(new DiscardCardCost());
|
||||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS));
|
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS));
|
||||||
ability.setTargetAdjuster(XTargetsAdjuster.instance);
|
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
|
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.common.DamageTargetControllerEffect;
|
import mage.abilities.effects.common.DamageTargetControllerEffect;
|
||||||
|
|
@ -9,12 +8,9 @@ import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
|
||||||
import mage.filter.common.FilterArtifactPermanent;
|
import mage.filter.common.FilterArtifactPermanent;
|
||||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetArtifactPermanent;
|
import mage.target.common.TargetArtifactPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -32,7 +28,8 @@ public final class Detonate extends CardImpl {
|
||||||
Effect effect = new DamageTargetControllerEffect(ManacostVariableValue.REGULAR);
|
Effect effect = new DamageTargetControllerEffect(ManacostVariableValue.REGULAR);
|
||||||
effect.setText("{this} deals X damage to that artifact's controller");
|
effect.setText("{this} deals X damage to that artifact's controller");
|
||||||
this.getSpellAbility().addEffect(effect);
|
this.getSpellAbility().addEffect(effect);
|
||||||
this.getSpellAbility().setTargetAdjuster(DetonateAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||||
|
this.getSpellAbility().addTarget(new TargetArtifactPermanent());
|
||||||
}
|
}
|
||||||
|
|
||||||
private Detonate(final Detonate card) {
|
private Detonate(final Detonate card) {
|
||||||
|
|
@ -44,16 +41,3 @@ public final class Detonate extends CardImpl {
|
||||||
return new Detonate(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,17 +1,12 @@
|
||||||
|
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
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.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -25,7 +20,8 @@ public final class Disembowel extends CardImpl {
|
||||||
|
|
||||||
// Destroy target creature with converted mana cost X.
|
// Destroy target creature with converted mana cost X.
|
||||||
this.getSpellAbility().addEffect(new DestroyTargetEffect("destroy target creature with mana value 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) {
|
private Disembowel(final Disembowel card) {
|
||||||
|
|
@ -37,16 +33,3 @@ public final class Disembowel extends CardImpl {
|
||||||
return new Disembowel(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -15,7 +15,7 @@ import mage.constants.Outcome;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
import mage.target.targetpointer.FixedTargets;
|
import mage.target.targetpointer.FixedTargets;
|
||||||
import mage.util.CardUtil;
|
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.
|
// 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().addEffect(new DisorderInTheCourtEffect());
|
||||||
this.getSpellAbility().setTargetAdjuster(DisorderInTheCourtAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
|
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||||
}
|
}
|
||||||
|
|
||||||
private DisorderInTheCourt(final DisorderInTheCourt card) {
|
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 {
|
class DisorderInTheCourtEffect extends OneShotEffect {
|
||||||
|
|
||||||
DisorderInTheCourtEffect() {
|
DisorderInTheCourtEffect() {
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,13 @@
|
||||||
|
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
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.common.TargetNonlandPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -27,7 +23,8 @@ public final class DistortingWake extends CardImpl {
|
||||||
Effect effect = new ReturnToHandTargetEffect();
|
Effect effect = new ReturnToHandTargetEffect();
|
||||||
effect.setText("Return X target nonland permanents to their owners' hands");
|
effect.setText("Return X target nonland permanents to their owners' hands");
|
||||||
this.getSpellAbility().addEffect(effect);
|
this.getSpellAbility().addEffect(effect);
|
||||||
this.getSpellAbility().setTargetAdjuster(DistortingWakeAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
|
this.getSpellAbility().addTarget(new TargetNonlandPermanent());
|
||||||
}
|
}
|
||||||
|
|
||||||
private DistortingWake(final DistortingWake card) {
|
private DistortingWake(final DistortingWake card) {
|
||||||
|
|
@ -39,16 +36,3 @@ public final class DistortingWake extends CardImpl {
|
||||||
return new DistortingWake(this);
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
|
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
|
@ -8,11 +7,8 @@ import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
import mage.constants.ComparisonType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
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.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// Gain control of target creature with converted mana cost X or less.
|
||||||
this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.Custom, true));
|
this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.Custom, true));
|
||||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature with mana value X or less")));
|
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) {
|
private Dominate(final Dominate card) {
|
||||||
|
|
@ -39,16 +35,3 @@ public final class Dominate extends CardImpl {
|
||||||
return new Dominate(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -7,11 +7,10 @@ import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.filter.StaticFilters;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// For each of X target permanents, create X tokens that are copies of that permanent.
|
||||||
this.getSpellAbility().addEffect(new DoppelgangEffect());
|
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) {
|
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 {
|
class DoppelgangEffect extends OneShotEffect {
|
||||||
|
|
||||||
DoppelgangEffect() {
|
DoppelgangEffect() {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
||||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
|
|
@ -8,9 +7,8 @@ import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -25,7 +23,8 @@ public final class DregsOfSorrow extends CardImpl {
|
||||||
// Destroy X target nonblack creatures. Draw X cards.
|
// Destroy X target nonblack creatures. Draw X cards.
|
||||||
this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target nonblack creatures"));
|
this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target nonblack creatures"));
|
||||||
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR));
|
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) {
|
private DregsOfSorrow(final DregsOfSorrow card) {
|
||||||
|
|
@ -37,14 +36,3 @@ public final class DregsOfSorrow extends CardImpl {
|
||||||
return new DregsOfSorrow(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,16 @@
|
||||||
package mage.cards.e;
|
package mage.cards.e;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.costs.common.SacrificeXTargetCost;
|
import mage.abilities.costs.common.SacrificeXTargetCost;
|
||||||
import mage.abilities.dynamicvalue.common.GetXValue;
|
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
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");
|
effect.setText("Destroy X target creatures");
|
||||||
this.getSpellAbility().addEffect(effect);
|
this.getSpellAbility().addEffect(effect);
|
||||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||||
this.getSpellAbility().setTargetAdjuster(EliminateTheCompetitionAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
}
|
}
|
||||||
|
|
||||||
private EliminateTheCompetition(final EliminateTheCompetition card) {
|
private EliminateTheCompetition(final EliminateTheCompetition card) {
|
||||||
|
|
@ -43,14 +41,3 @@ public final class EliminateTheCompetition extends CardImpl {
|
||||||
return new EliminateTheCompetition(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.BecomesTargetAnyTriggeredAbility;
|
import mage.abilities.common.BecomesTargetAnyTriggeredAbility;
|
||||||
import mage.abilities.common.ScryTriggeredAbility;
|
import mage.abilities.common.ScryTriggeredAbility;
|
||||||
|
import mage.abilities.dynamicvalue.common.GetScryAmount;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
|
|
@ -14,9 +15,8 @@ import mage.constants.SubType;
|
||||||
import mage.constants.SuperType;
|
import mage.constants.SuperType;
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.TargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -35,10 +35,12 @@ public final class ElrondMasterOfHealing extends CardImpl {
|
||||||
this.toughness = new MageInt(4);
|
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.
|
// 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, " +
|
.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"))
|
"where X is the number of cards looked at while scrying this way"));
|
||||||
.setTargetAdjuster(ElrondMasterOfHealingAdjuster.instance));
|
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.
|
// 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),
|
this.addAbility(new BecomesTargetAnyTriggeredAbility(new DrawCardSourceControllerEffect(1),
|
||||||
|
|
@ -55,19 +57,3 @@ public final class ElrondMasterOfHealing extends CardImpl {
|
||||||
return new ElrondMasterOfHealing(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -4,15 +4,15 @@ import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.AttacksTriggeredAbility;
|
import mage.abilities.common.AttacksTriggeredAbility;
|
||||||
import mage.abilities.common.ScryTriggeredAbility;
|
import mage.abilities.common.ScryTriggeredAbility;
|
||||||
|
import mage.abilities.dynamicvalue.common.GetScryAmount;
|
||||||
import mage.abilities.effects.common.TapTargetEffect;
|
import mage.abilities.effects.common.TapTargetEffect;
|
||||||
import mage.abilities.effects.keyword.ScryEffect;
|
import mage.abilities.effects.keyword.ScryEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetNonlandPermanent;
|
import mage.target.common.TargetNonlandPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.TargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -33,10 +33,13 @@ public final class ElvishMariner extends CardImpl {
|
||||||
this.addAbility(new AttacksTriggeredAbility(new ScryEffect(1, false)));
|
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.
|
// 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 " +
|
.setText("tap up to X target nonland permanents, where X is " +
|
||||||
"the number of cards looked at while scrying this way"))
|
"the number of cards looked at while scrying this way"));
|
||||||
.setTargetAdjuster(ElvishMarinerAdjuster.instance));
|
ability.addTarget(new TargetNonlandPermanent(0, 1));
|
||||||
|
ability.setTargetAdjuster(new TargetsCountAdjuster(GetScryAmount.instance));
|
||||||
|
this.addAbility(ability);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private ElvishMariner(final ElvishMariner card) {
|
private ElvishMariner(final ElvishMariner card) {
|
||||||
|
|
@ -48,19 +51,3 @@ public final class ElvishMariner extends CardImpl {
|
||||||
return new ElvishMariner(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -18,9 +18,8 @@ import mage.constants.CardType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.filter.common.FilterControlledPermanent;
|
import mage.filter.common.FilterControlledPermanent;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetControlledCreaturePermanent;
|
import mage.target.common.TargetControlledCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.TargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -53,7 +52,7 @@ public final class EnduranceBobblehead extends CardImpl {
|
||||||
.setText("and gain indestructible until end of turn, "
|
.setText("and gain indestructible until end of turn, "
|
||||||
+ "where X is the number of Bobbleheads you control as you activate this ability"));
|
+ "where X is the number of Bobbleheads you control as you activate this ability"));
|
||||||
ability.addTarget(new TargetControlledCreaturePermanent(0, 0));
|
ability.addTarget(new TargetControlledCreaturePermanent(0, 0));
|
||||||
ability.setTargetAdjuster(new EnduranceBobbleheadAdjuster(xValue));
|
ability.setTargetAdjuster(new TargetsCountAdjuster(xValue));
|
||||||
ability.addHint(hint);
|
ability.addHint(hint);
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
@ -67,21 +66,3 @@ public final class EnduranceBobblehead extends CardImpl {
|
||||||
return new EnduranceBobblehead(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -10,12 +10,8 @@ import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
import mage.constants.ComparisonType;
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.target.targetadjustment.PowerTargetAdjuster;
|
||||||
import mage.filter.predicate.mageobject.PowerPredicate;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.TargetPermanent;
|
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -34,7 +30,8 @@ public final class EntDraughtBasin extends CardImpl {
|
||||||
new ManaCostsImpl<>("{X}")
|
new ManaCostsImpl<>("{X}")
|
||||||
);
|
);
|
||||||
ability.addCost(new TapSourceCost());
|
ability.addCost(new TapSourceCost());
|
||||||
ability.setTargetAdjuster(EntDraughtBasinAdjuster.instance);
|
ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.EQUAL_TO));
|
||||||
|
ability.addTarget(new TargetCreaturePermanent());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -47,16 +44,3 @@ public final class EntDraughtBasin extends CardImpl {
|
||||||
return new EntDraughtBasin(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,8 @@ import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
import mage.constants.ComparisonType;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.target.targetadjustment.PowerTargetAdjuster;
|
||||||
import mage.filter.predicate.mageobject.PowerPredicate;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.TargetPermanent;
|
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -37,7 +33,8 @@ public final class EntrancingLyre extends CardImpl {
|
||||||
);
|
);
|
||||||
ability.addCost(new TapSourceCost());
|
ability.addCost(new TapSourceCost());
|
||||||
ability.addEffect(new DontUntapAsLongAsSourceTappedEffect());
|
ability.addEffect(new DontUntapAsLongAsSourceTappedEffect());
|
||||||
ability.setTargetAdjuster(EntrancingLyreAdjuster.instance);
|
ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS));
|
||||||
|
ability.addTarget(new TargetCreaturePermanent());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -50,16 +47,3 @@ public final class EntrancingLyre extends CardImpl {
|
||||||
return new EntrancingLyre(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,18 +1,14 @@
|
||||||
|
|
||||||
package mage.cards.e;
|
package mage.cards.e;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
|
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -29,7 +25,7 @@ public final class EntrancingMelody extends CardImpl {
|
||||||
// Gain control of target creature with converted mana cost X.
|
// Gain control of target creature with converted mana cost X.
|
||||||
this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.Custom, true));
|
this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.Custom, true));
|
||||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
|
this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
|
||||||
this.getSpellAbility().setTargetAdjuster(EntrancingMelodyAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||||
}
|
}
|
||||||
|
|
||||||
private EntrancingMelody(final EntrancingMelody card) {
|
private EntrancingMelody(final EntrancingMelody card) {
|
||||||
|
|
@ -41,16 +37,3 @@ public final class EntrancingMelody extends CardImpl {
|
||||||
return new EntrancingMelody(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,16 +1,13 @@
|
||||||
package mage.cards.e;
|
package mage.cards.e;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
|
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
|
||||||
import mage.abilities.keyword.MiracleAbility;
|
import mage.abilities.keyword.MiracleAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.filter.common.FilterCreatureCard;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.Target;
|
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// 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().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}
|
// Miracle {X}{B}{B}
|
||||||
this.addAbility(new MiracleAbility("{X}{B}{B}"));
|
this.addAbility(new MiracleAbility("{X}{B}{B}"));
|
||||||
|
|
@ -39,20 +37,3 @@ public final class EntreatTheDead extends CardImpl {
|
||||||
return new EntreatTheDead(this);
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ package mage.cards.e;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.TriggeredAbilityImpl;
|
import mage.abilities.TriggeredAbilityImpl;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
|
|
@ -23,7 +22,7 @@ import mage.game.permanent.Permanent;
|
||||||
import mage.game.stack.Spell;
|
import mage.game.stack.Spell;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
import mage.target.targetpointer.FixedTargets;
|
import mage.target.targetpointer.FixedTargets;
|
||||||
import mage.util.CardUtil;
|
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.
|
// 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 ability = new EntersBattlefieldTriggeredAbility(new ExtraordinaryJourneyEffect());
|
||||||
ability.setTargetAdjuster(ExtraordinaryJourneyAdjuster.instance);
|
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
|
ability.addTarget(new TargetCreaturePermanent(0, 1));
|
||||||
this.addAbility(ability);
|
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.
|
// 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 {
|
class ExtraordinaryJourneyEffect extends OneShotEffect {
|
||||||
|
|
||||||
ExtraordinaryJourneyEffect() {
|
ExtraordinaryJourneyEffect() {
|
||||||
|
|
|
||||||
|
|
@ -9,14 +9,11 @@ import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
import mage.constants.ComparisonType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.FilterPermanent;
|
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
|
||||||
import mage.filter.predicate.mageobject.ToughnessPredicate;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.ToughnessTargetAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// 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 DestroyTargetEffect().setText("destroy up to three target creatures with toughness X or less"));
|
||||||
this.getSpellAbility().addEffect(new FinaleOfEternityEffect());
|
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) {
|
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 {
|
class FinaleOfEternityEffect extends OneShotEffect {
|
||||||
|
|
||||||
FinaleOfEternityEffect() {
|
FinaleOfEternityEffect() {
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,8 @@ import mage.filter.FilterCard;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.Target;
|
|
||||||
import mage.target.common.TargetAnyTarget;
|
import mage.target.common.TargetAnyTarget;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// Firestorm deals X damage to each of X target creatures and/or players.
|
||||||
this.getSpellAbility().addEffect(new FirestormEffect());
|
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) {
|
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 {
|
class FirestormEffect extends OneShotEffect {
|
||||||
|
|
||||||
FirestormEffect() {
|
FirestormEffect() {
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,15 @@
|
||||||
|
|
||||||
package mage.cards.g;
|
package mage.cards.g;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
import mage.abilities.keyword.AssistAbility;
|
import mage.abilities.keyword.AssistAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
import mage.constants.ComparisonType;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.predicate.mageobject.PowerPredicate;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.PowerTargetAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -29,7 +26,8 @@ public final class GangUp extends CardImpl {
|
||||||
|
|
||||||
// Destroy target creature with power X or less.
|
// Destroy target creature with power X or less.
|
||||||
this.getSpellAbility().addEffect(new DestroyTargetEffect("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) {
|
private GangUp(final GangUp card) {
|
||||||
|
|
@ -41,16 +39,3 @@ public final class GangUp extends CardImpl {
|
||||||
return new GangUp(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -15,7 +15,7 @@ import mage.filter.predicate.Predicates;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetCardInGraveyard;
|
import mage.target.common.TargetCardInGraveyard;
|
||||||
import mage.target.targetadjustment.XCMCGraveyardAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// {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.
|
// 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 ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GethLordOfTheVaultEffect(), new ManaCostsImpl<>("{X}{B}"));
|
||||||
ability.setTargetAdjuster(XCMCGraveyardAdjuster.instance);
|
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||||
ability.addTarget(new TargetCardInGraveyard(filter));
|
ability.addTarget(new TargetCardInGraveyard(filter));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,10 +13,9 @@ import mage.constants.CardType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -48,7 +47,8 @@ public final class GhostLitDrifter extends CardImpl {
|
||||||
FlyingAbility.getInstance(), Duration.EndOfTurn,
|
FlyingAbility.getInstance(), Duration.EndOfTurn,
|
||||||
"X target creatures gain flying until end of turn"
|
"X target creatures gain flying until end of turn"
|
||||||
));
|
));
|
||||||
ability.setTargetAdjuster(GhostLitDrifterAdjuster.instance);
|
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
|
ability.addTarget(new TargetCreaturePermanent());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -61,13 +61,3 @@ public final class GhostLitDrifter extends CardImpl {
|
||||||
return new GhostLitDrifter(this);
|
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()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,13 @@
|
||||||
|
|
||||||
package mage.cards.g;
|
package mage.cards.g;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.common.TapTargetEffect;
|
import mage.abilities.effects.common.TapTargetEffect;
|
||||||
import mage.abilities.effects.keyword.ScryEffect;
|
import mage.abilities.effects.keyword.ScryEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.filter.StaticFilters;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -25,7 +22,8 @@ public final class GlimpseTheSunGod extends CardImpl {
|
||||||
// Tap X target creatures. Scry 1.
|
// Tap X target creatures. Scry 1.
|
||||||
this.getSpellAbility().addEffect(new TapTargetEffect("tap X target creatures"));
|
this.getSpellAbility().addEffect(new TapTargetEffect("tap X target creatures"));
|
||||||
this.getSpellAbility().addEffect(new ScryEffect(1));
|
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) {
|
private GlimpseTheSunGod(final GlimpseTheSunGod card) {
|
||||||
|
|
@ -37,14 +35,3 @@ public final class GlimpseTheSunGod extends CardImpl {
|
||||||
return new GlimpseTheSunGod(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.g;
|
package mage.cards.g;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
|
@ -14,7 +13,9 @@ import mage.constants.Zone;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.filter.predicate.Predicates;
|
import mage.filter.predicate.Predicates;
|
||||||
import mage.target.TargetPermanent;
|
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.
|
// {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 ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl<>("{X}{X}{1}"));
|
||||||
ability.addTarget(new TargetPermanent(filter));
|
ability.addTarget(new TargetPermanent(filter));
|
||||||
ability.setTargetAdjuster(XCMCPermanentAdjuster.instance);
|
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,12 @@
|
||||||
|
|
||||||
package mage.cards.g;
|
package mage.cards.g;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.common.TapTargetEffect;
|
import mage.abilities.effects.common.TapTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.filter.common.FilterNonlandPermanent;
|
import mage.target.common.TargetNonlandPermanent;
|
||||||
import mage.game.Game;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
import mage.target.TargetPermanent;
|
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -23,7 +20,8 @@ public final class Gridlock extends CardImpl {
|
||||||
|
|
||||||
// Tap X target nonland permanents.
|
// Tap X target nonland permanents.
|
||||||
this.getSpellAbility().addEffect(new TapTargetEffect("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) {
|
private Gridlock(final Gridlock card) {
|
||||||
|
|
@ -35,14 +33,3 @@ public final class Gridlock extends CardImpl {
|
||||||
return new Gridlock(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.h;
|
package mage.cards.h;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
|
@ -14,7 +13,9 @@ import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.targetadjustment.XCMCPermanentAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Loki
|
* @author Loki
|
||||||
|
|
@ -38,7 +39,7 @@ public final class HearthKami extends CardImpl {
|
||||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl<>("{X}"));
|
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl<>("{X}"));
|
||||||
ability.addCost(new SacrificeSourceCost());
|
ability.addCost(new SacrificeSourceCost());
|
||||||
ability.addTarget(new TargetPermanent(filter));
|
ability.addTarget(new TargetPermanent(filter));
|
||||||
ability.setTargetAdjuster(XCMCPermanentAdjuster.instance);
|
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,13 +10,12 @@ import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.common.FilterCreatureCard;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.token.Token;
|
import mage.game.permanent.token.Token;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.Target;
|
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
import mage.util.functions.CopyTokenFunction;
|
import mage.util.functions.CopyTokenFunction;
|
||||||
|
|
||||||
import java.util.HashSet;
|
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.
|
// 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().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) {
|
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 {
|
class HourOfEternityEffect extends OneShotEffect {
|
||||||
|
|
||||||
HourOfEternityEffect() {
|
HourOfEternityEffect() {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.condition.LockedInCondition;
|
import mage.abilities.condition.LockedInCondition;
|
||||||
import mage.abilities.condition.common.FerociousCondition;
|
import mage.abilities.condition.common.FerociousCondition;
|
||||||
import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect;
|
import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect;
|
||||||
|
|
@ -11,9 +10,8 @@ import mage.abilities.hint.common.FerociousHint;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -34,7 +32,8 @@ public final class IcyBlast extends CardImpl {
|
||||||
new LockedInCondition(FerociousCondition.instance));
|
new LockedInCondition(FerociousCondition.instance));
|
||||||
effect.setText("<br/><i>Ferocious</i> — If you control a creature with power 4 or greater, those creatures don't untap during their controllers' next untap steps");
|
effect.setText("<br/><i>Ferocious</i> — 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().addEffect(effect);
|
||||||
this.getSpellAbility().setTargetAdjuster(IcyBlastAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
|
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||||
this.getSpellAbility().addHint(FerociousHint.instance);
|
this.getSpellAbility().addHint(FerociousHint.instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -47,13 +46,3 @@ public final class IcyBlast extends CardImpl {
|
||||||
return new IcyBlast(this);
|
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()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -24,7 +24,7 @@ import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.Target;
|
import mage.target.Target;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -59,7 +59,7 @@ public final class IllithidHarvester extends AdventureCard {
|
||||||
this.getSpellCard().getSpellAbility().addEffect(new DontUntapInControllersNextUntapStepTargetEffect()
|
this.getSpellCard().getSpellAbility().addEffect(new DontUntapInControllersNextUntapStepTargetEffect()
|
||||||
.setText("They don't untap during their controllers' next untap steps"));
|
.setText("They don't untap during their controllers' next untap steps"));
|
||||||
this.getSpellCard().getSpellAbility().addTarget(new TargetCreaturePermanent());
|
this.getSpellCard().getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||||
this.getSpellCard().getSpellAbility().setTargetAdjuster(IllithidHarvesterAdjuster.instance);
|
this.getSpellCard().getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
|
|
||||||
this.finalizeAdventure();
|
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 {
|
class IllithidHarvesterEffect extends OneShotEffect {
|
||||||
|
|
||||||
IllithidHarvesterEffect() {
|
IllithidHarvesterEffect() {
|
||||||
|
|
|
||||||
|
|
@ -7,14 +7,13 @@ import mage.cards.*;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.predicate.Predicates;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Library;
|
import mage.players.Library;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
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.
|
// 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().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) {
|
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 {
|
class IndomitableCreativityEffect extends OneShotEffect {
|
||||||
|
|
||||||
IndomitableCreativityEffect() {
|
IndomitableCreativityEffect() {
|
||||||
|
|
|
||||||
|
|
@ -5,16 +5,13 @@ import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
|
||||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// 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().addEffect(new KaerveksPurgeEffect());
|
||||||
this.getSpellAbility().setTargetAdjuster(KaerveksPurgeAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||||
|
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||||
}
|
}
|
||||||
|
|
||||||
private KaerveksPurge(final KaerveksPurge card) {
|
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 {
|
class KaerveksPurgeEffect extends OneShotEffect {
|
||||||
|
|
||||||
KaerveksPurgeEffect() {
|
KaerveksPurgeEffect() {
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,13 @@
|
||||||
|
|
||||||
package mage.cards.k;
|
package mage.cards.k;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
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.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.PowerTargetAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -25,7 +21,8 @@ public final class KillingGlare extends CardImpl {
|
||||||
|
|
||||||
// Destroy target creature with power X or less.
|
// Destroy target creature with power X or less.
|
||||||
this.getSpellAbility().addEffect(new DestroyTargetEffect("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) {
|
private KillingGlare(final KillingGlare card) {
|
||||||
|
|
@ -37,16 +34,3 @@ public final class KillingGlare extends CardImpl {
|
||||||
return new KillingGlare(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.l;
|
package mage.cards.l;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.MageObject;
|
import mage.MageObject;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
|
@ -11,27 +10,21 @@ import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.CopyEffect;
|
import mage.abilities.effects.common.CopyEffect;
|
||||||
import mage.abilities.effects.keyword.SurveilEffect;
|
import mage.abilities.effects.keyword.SurveilEffect;
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.SuperType;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.*;
|
||||||
import mage.constants.ComparisonType;
|
import mage.filter.StaticFilters;
|
||||||
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.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.game.permanent.PermanentCard;
|
import mage.game.permanent.PermanentCard;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
import mage.util.functions.CopyApplier;
|
import mage.util.functions.CopyApplier;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class LazavTheMultifarious extends CardImpl {
|
public final class LazavTheMultifarious extends CardImpl {
|
||||||
|
|
@ -54,7 +47,8 @@ public final class LazavTheMultifarious extends CardImpl {
|
||||||
new LazavTheMultifariousEffect(),
|
new LazavTheMultifariousEffect(),
|
||||||
new ManaCostsImpl<>("{X}")
|
new ManaCostsImpl<>("{X}")
|
||||||
);
|
);
|
||||||
ability.setTargetAdjuster(LazavTheMultifariousAdjuster.instance);
|
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||||
|
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
|
||||||
this.addAbility(ability);
|
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 {
|
class LazavTheMultifariousEffect extends OneShotEffect {
|
||||||
|
|
||||||
LazavTheMultifariousEffect() {
|
LazavTheMultifariousEffect() {
|
||||||
|
|
@ -134,7 +115,8 @@ class LazavTheMultifariousCopyApplier extends CopyApplier {
|
||||||
new LazavTheMultifariousEffect(),
|
new LazavTheMultifariousEffect(),
|
||||||
new ManaCostsImpl<>("{X}")
|
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.getAbilities().add(ability);
|
||||||
blueprint.setName("Lazav, the Multifarious");
|
blueprint.setName("Lazav, the Multifarious");
|
||||||
blueprint.addSuperType(SuperType.LEGENDARY);
|
blueprint.addSuperType(SuperType.LEGENDARY);
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.l;
|
package mage.cards.l;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
|
@ -8,18 +7,17 @@ import mage.abilities.costs.common.TapSourceCost;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
import mage.abilities.effects.common.CopyTargetSpellEffect;
|
import mage.abilities.effects.common.CopyTargetSpellEffect;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.TargetController;
|
import mage.constants.TargetController;
|
||||||
import mage.filter.FilterSpell;
|
import mage.filter.FilterSpell;
|
||||||
import mage.filter.common.FilterInstantOrSorcerySpell;
|
import mage.filter.common.FilterInstantOrSorcerySpell;
|
||||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.TargetSpell;
|
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.addCost(new TapSourceCost());
|
||||||
ability.addTarget(new TargetSpell(filter));
|
ability.addTarget(new TargetSpell(filter));
|
||||||
ability.setTargetAdjuster(LeagueGuildmageAdjuster.instance);
|
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -69,17 +67,3 @@ public final class LeagueGuildmage extends CardImpl {
|
||||||
return new LeagueGuildmage(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,26 +1,21 @@
|
||||||
package mage.cards.l;
|
package mage.cards.l;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||||
|
import mage.abilities.dynamicvalue.common.CountersSourceCount;
|
||||||
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
|
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
|
||||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.*;
|
||||||
import mage.constants.ComparisonType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.TargetController;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
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.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.PowerTargetAdjuster;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author LevelX2
|
* @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.
|
// 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 ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainControlTargetEffect(Duration.EndOfGame, true), new SacrificeSourceCost());
|
||||||
ability.addTarget(new TargetCreaturePermanent(0, 0, filter, false));
|
ability.addTarget(new TargetCreaturePermanent(filter));
|
||||||
ability.setTargetAdjuster(LegacysAllureAdjuster.instance);
|
ability.setTargetAdjuster(new PowerTargetAdjuster(new CountersSourceCount(CounterType.TREASURE), ComparisonType.OR_LESS));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -52,19 +47,3 @@ public final class LegacysAllure extends CardImpl {
|
||||||
return new LegacysAllure(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -15,15 +15,13 @@ import mage.cards.Card;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.common.FilterCreatureCard;
|
|
||||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.game.permanent.PermanentCard;
|
import mage.game.permanent.PermanentCard;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
import mage.util.functions.CopyApplier;
|
import mage.util.functions.CopyApplier;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -52,7 +50,8 @@ public final class LikenessLooter extends CardImpl {
|
||||||
new LikenessLooterEffect(),
|
new LikenessLooterEffect(),
|
||||||
new ManaCostsImpl<>("{X}")
|
new ManaCostsImpl<>("{X}")
|
||||||
);
|
);
|
||||||
ability.setTargetAdjuster(LikenessLooterAdjuster.instance);
|
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||||
|
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
|
||||||
this.addAbility(ability);
|
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 {
|
class LikenessLooterEffect extends OneShotEffect {
|
||||||
|
|
||||||
LikenessLooterEffect() {
|
LikenessLooterEffect() {
|
||||||
|
|
@ -130,7 +116,8 @@ class LikenessLooterCopyApplier extends CopyApplier {
|
||||||
new LikenessLooterEffect(),
|
new LikenessLooterEffect(),
|
||||||
new ManaCostsImpl<>("{X}")
|
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);
|
blueprint.getAbilities().add(ability);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,25 +2,19 @@ package mage.cards.l;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.LoyaltyAbility;
|
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.GetEmblemEffect;
|
||||||
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
|
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
|
||||||
import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
|
import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.SuperType;
|
import mage.constants.SuperType;
|
||||||
import mage.filter.FilterCard;
|
|
||||||
import mage.filter.common.FilterCreatureCard;
|
import mage.filter.common.FilterCreatureCard;
|
||||||
import mage.filter.predicate.Predicates;
|
import mage.filter.predicate.Predicates;
|
||||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.command.emblems.LilianaDefiantNecromancerEmblem;
|
import mage.game.command.emblems.LilianaDefiantNecromancerEmblem;
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// -X: Return target nonlegendary creature with converted mana cost X from your graveyard to the battlefield.
|
||||||
Ability ability = new LoyaltyAbility(new ReturnFromGraveyardToBattlefieldTargetEffect());
|
Ability ability = new LoyaltyAbility(new ReturnFromGraveyardToBattlefieldTargetEffect());
|
||||||
ability.addTarget(new TargetCardInYourGraveyard(filter));
|
ability.addTarget(new TargetCardInYourGraveyard(filter));
|
||||||
ability.setTargetAdjuster(LilianaDefiantNecromancerAdjuster.instance);
|
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||||
this.addAbility(ability);
|
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.";
|
//-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);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.l;
|
package mage.cards.l;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.abilityword.GrandeurAbility;
|
import mage.abilities.abilityword.GrandeurAbility;
|
||||||
|
|
@ -11,11 +10,7 @@ import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.*;
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.SuperType;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.filter.common.FilterControlledPermanent;
|
import mage.filter.common.FilterControlledPermanent;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
|
|
@ -26,7 +21,9 @@ import mage.target.TargetPermanent;
|
||||||
import mage.target.TargetPlayer;
|
import mage.target.TargetPlayer;
|
||||||
import mage.target.common.TargetControlledCreaturePermanent;
|
import mage.target.common.TargetControlledCreaturePermanent;
|
||||||
import mage.target.common.TargetControlledPermanent;
|
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 ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new ManaCostsImpl<>("{X}{U}{U}"));
|
||||||
ability.addCost(new TapSourceCost());
|
ability.addCost(new TapSourceCost());
|
||||||
ability.addTarget(new TargetPermanent(filter));
|
ability.addTarget(new TargetPermanent(filter));
|
||||||
ability.setTargetAdjuster(XCMCPermanentAdjuster.instance);
|
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||||
this.addAbility(ability);
|
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.
|
// 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.
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ package mage.cards.l;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.TapTargetEffect;
|
import mage.abilities.effects.common.TapTargetEffect;
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||||
|
|
@ -21,7 +20,7 @@ import mage.filter.predicate.permanent.TappedPredicate;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// 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 ability = new EntersBattlefieldTriggeredAbility(new TapTargetEffect("tap X target creatures"));
|
||||||
ability.addEffect(new LostInTheMazeEffect());
|
ability.addEffect(new LostInTheMazeEffect());
|
||||||
ability.setTargetAdjuster(LostInTheMazeAdjuster.instance);
|
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
|
ability.addTarget(new TargetCreaturePermanent());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
|
|
||||||
// Tapped creatures you control have hexproof.
|
// 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 {
|
class LostInTheMazeEffect extends OneShotEffect {
|
||||||
|
|
||||||
LostInTheMazeEffect() {
|
LostInTheMazeEffect() {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.l;
|
package mage.cards.l;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.condition.Condition;
|
import mage.abilities.condition.Condition;
|
||||||
import mage.abilities.condition.common.SourceTargetsPermanentCondition;
|
import mage.abilities.condition.common.SourceTargetsPermanentCondition;
|
||||||
|
|
@ -9,18 +8,16 @@ import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
import mage.filter.predicate.Predicate;
|
import mage.filter.predicate.Predicate;
|
||||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -50,7 +47,8 @@ public final class LullmagesDomination extends CardImpl {
|
||||||
// Gain control of target creature with converted mana cost X.
|
// Gain control of target creature with converted mana cost X.
|
||||||
this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.Custom)
|
this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.Custom)
|
||||||
.setText("gain control of target creature with mana value X"));
|
.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) {
|
private LullmagesDomination(final LullmagesDomination card) {
|
||||||
|
|
@ -72,16 +70,3 @@ enum LullmagesDominationPredicate implements Predicate<Permanent> {
|
||||||
return player != null && player.getGraveyard().size() >= 8;
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
|
@ -15,7 +14,9 @@ import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.targetadjustment.XTargetsAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author duncant
|
* @author duncant
|
||||||
|
|
@ -36,7 +37,7 @@ public final class MagusOfTheCandelabra extends CardImpl {
|
||||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{X}"));
|
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{X}"));
|
||||||
ability.addCost(new TapSourceCost());
|
ability.addCost(new TapSourceCost());
|
||||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS));
|
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS));
|
||||||
ability.setTargetAdjuster(XTargetsAdjuster.instance);
|
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
|
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
|
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
|
||||||
|
|
@ -11,9 +10,8 @@ import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.filter.predicate.Predicates;
|
import mage.filter.predicate.Predicates;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -22,6 +20,16 @@ import java.util.UUID;
|
||||||
*/
|
*/
|
||||||
public final class MaliciousAdvice extends CardImpl {
|
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) {
|
public MaliciousAdvice(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}{B}");
|
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");
|
effect.setText("Tap X target artifacts, creatures, and/or lands");
|
||||||
this.getSpellAbility().addEffect(effect);
|
this.getSpellAbility().addEffect(effect);
|
||||||
this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(ManacostVariableValue.REGULAR));
|
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) {
|
private MaliciousAdvice(final MaliciousAdvice card) {
|
||||||
|
|
@ -42,22 +51,3 @@ public final class MaliciousAdvice extends CardImpl {
|
||||||
return new MaliciousAdvice(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -12,18 +12,15 @@ import mage.constants.ComparisonType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.FilterCard;
|
||||||
import mage.filter.FilterPermanent;
|
|
||||||
import mage.filter.common.FilterCreatureCard;
|
import mage.filter.common.FilterCreatureCard;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
|
||||||
import mage.filter.predicate.Predicate;
|
import mage.filter.predicate.Predicate;
|
||||||
import mage.filter.predicate.mageobject.ColorPredicate;
|
import mage.filter.predicate.mageobject.ColorPredicate;
|
||||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.TargetPermanent;
|
|
||||||
import mage.target.common.TargetCardInLibrary;
|
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 mage.util.CardUtil;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// 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().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) {
|
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 {
|
class MarchOfBurgeoningLifeEffect extends OneShotEffect {
|
||||||
|
|
||||||
private static class MarchOfBurgeoningLifePredicate implements Predicate<Card> {
|
private static class MarchOfBurgeoningLifePredicate implements Predicate<Card> {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import mage.ObjectColor;
|
import mage.ObjectColor;
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.costs.costadjusters.ExileCardsFromHandAdjuster;
|
import mage.abilities.costs.costadjusters.ExileCardsFromHandAdjuster;
|
||||||
import mage.abilities.effects.common.ExileTargetEffect;
|
import mage.abilities.effects.common.ExileTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
|
|
@ -12,10 +11,8 @@ import mage.filter.FilterCard;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.filter.predicate.Predicates;
|
import mage.filter.predicate.Predicates;
|
||||||
import mage.filter.predicate.mageobject.ColorPredicate;
|
import mage.filter.predicate.mageobject.ColorPredicate;
|
||||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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 FilterCard filter = new FilterCard("white cards from your hand");
|
||||||
|
|
||||||
|
private static final FilterPermanent filter2 = new FilterPermanent("artifact, creature, or enchantment");
|
||||||
|
|
||||||
static {
|
static {
|
||||||
filter.add(new ColorPredicate(ObjectColor.WHITE));
|
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) {
|
public MarchOfOtherworldlyLight(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
|
@ -40,7 +44,8 @@ public final class MarchOfOtherworldlyLight extends CardImpl {
|
||||||
this.getSpellAbility().addEffect(new ExileTargetEffect(
|
this.getSpellAbility().addEffect(new ExileTargetEffect(
|
||||||
"exile target artifact, creature, or enchantment with mana value X or less"
|
"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) {
|
private MarchOfOtherworldlyLight(final MarchOfOtherworldlyLight card) {
|
||||||
|
|
@ -52,23 +57,3 @@ public final class MarchOfOtherworldlyLight extends CardImpl {
|
||||||
return new MarchOfOtherworldlyLight(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import mage.ObjectColor;
|
import mage.ObjectColor;
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.costs.costadjusters.ExileCardsFromHandAdjuster;
|
import mage.abilities.costs.costadjusters.ExileCardsFromHandAdjuster;
|
||||||
import mage.abilities.effects.common.PhaseOutTargetEffect;
|
import mage.abilities.effects.common.PhaseOutTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
|
|
@ -9,9 +8,8 @@ import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.FilterCard;
|
||||||
import mage.filter.predicate.mageobject.ColorPredicate;
|
import mage.filter.predicate.mageobject.ColorPredicate;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -34,7 +32,8 @@ public final class MarchOfSwirlingMist extends CardImpl {
|
||||||
|
|
||||||
// Up to X target creatures phase out.
|
// Up to X target creatures phase out.
|
||||||
this.getSpellAbility().addEffect(new PhaseOutTargetEffect().setText("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) {
|
private MarchOfSwirlingMist(final MarchOfSwirlingMist card) {
|
||||||
|
|
@ -46,13 +45,3 @@ public final class MarchOfSwirlingMist extends CardImpl {
|
||||||
return new MarchOfSwirlingMist(this);
|
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()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -13,11 +13,9 @@ import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.common.FilterCreatureCard;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.TargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -44,7 +42,8 @@ public final class MarshalsAnthem extends CardImpl {
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(
|
Ability ability = new EntersBattlefieldTriggeredAbility(
|
||||||
new ReturnFromGraveyardToBattlefieldTargetEffect().setText(rule), false
|
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);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -57,17 +56,3 @@ public final class MarshalsAnthem extends CardImpl {
|
||||||
return new MarshalsAnthem(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -5,7 +5,6 @@ import mage.ObjectColor;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.costs.Cost;
|
import mage.abilities.costs.Cost;
|
||||||
import mage.abilities.costs.VariableCost;
|
|
||||||
import mage.abilities.costs.VariableCostImpl;
|
import mage.abilities.costs.VariableCostImpl;
|
||||||
import mage.abilities.costs.VariableCostType;
|
import mage.abilities.costs.VariableCostType;
|
||||||
import mage.abilities.costs.common.RevealTargetFromHandCost;
|
import mage.abilities.costs.common.RevealTargetFromHandCost;
|
||||||
|
|
@ -18,13 +17,12 @@ import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.FilterCard;
|
||||||
import mage.filter.StaticFilters;
|
|
||||||
import mage.filter.predicate.mageobject.ColorPredicate;
|
import mage.filter.predicate.mageobject.ColorPredicate;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetCardInASingleGraveyard;
|
import mage.target.common.TargetCardInASingleGraveyard;
|
||||||
import mage.target.common.TargetCardInHand;
|
import mage.target.common.TargetCardInHand;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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 ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new GenericManaCost(1));
|
||||||
ability.addCost(new RevealVariableBlackCardsFromHandCost());
|
ability.addCost(new RevealVariableBlackCardsFromHandCost());
|
||||||
ability.addCost(new SacrificeSourceCost());
|
ability.addCost(new SacrificeSourceCost());
|
||||||
ability.addTarget(new TargetCardInASingleGraveyard(0, 1, StaticFilters.FILTER_CARD_CARDS));
|
ability.addTarget(new TargetCardInASingleGraveyard(0, 1, new FilterCard("up to X target cards")));
|
||||||
ability.setTargetAdjuster(MartyrOfBonesAdjuster.instance);
|
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
this.addAbility(ability);
|
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 {
|
class RevealVariableBlackCardsFromHandCost extends VariableCostImpl {
|
||||||
|
|
||||||
private static final FilterCard filter = new FilterCard("X black cards from your hand");
|
private static final FilterCard filter = new FilterCard("X black cards from your hand");
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,12 @@
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
|
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreatureOrPlaneswalker;
|
import mage.target.common.TargetCreatureOrPlaneswalker;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -26,7 +24,7 @@ public final class MassManipulation extends CardImpl {
|
||||||
.setText("Gain control of X target creatures and/or planeswalkers.")
|
.setText("Gain control of X target creatures and/or planeswalkers.")
|
||||||
);
|
);
|
||||||
this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker());
|
this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker());
|
||||||
this.getSpellAbility().setTargetAdjuster(MassManipulationAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
}
|
}
|
||||||
|
|
||||||
private MassManipulation(final MassManipulation card) {
|
private MassManipulation(final MassManipulation card) {
|
||||||
|
|
@ -38,13 +36,3 @@ public final class MassManipulation extends CardImpl {
|
||||||
return new MassManipulation(this);
|
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()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,11 @@
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.common.DamageTargetEffect;
|
import mage.abilities.effects.common.DamageTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetAnyTarget;
|
import mage.target.common.TargetAnyTarget;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -23,7 +21,8 @@ public final class MeteorBlast extends CardImpl {
|
||||||
this.getSpellAbility().addEffect(
|
this.getSpellAbility().addEffect(
|
||||||
new DamageTargetEffect(4).setText("{this} deals 4 damage to each of X targets")
|
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) {
|
private MeteorBlast(final MeteorBlast card) {
|
||||||
|
|
@ -35,15 +34,3 @@ public final class MeteorBlast extends CardImpl {
|
||||||
return new MeteorBlast(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,11 @@
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.common.DamageMultiEffect;
|
import mage.abilities.effects.common.DamageMultiEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreatureOrPlaneswalkerAmount;
|
import mage.target.common.TargetCreatureOrPlaneswalkerAmount;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.")
|
setText("{this} deals 8 damage divided as you choose among X target creatures and/or planeswalkers.")
|
||||||
);
|
);
|
||||||
this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalkerAmount(8));
|
this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalkerAmount(8));
|
||||||
this.getSpellAbility().setTargetAdjuster(MeteorSwarmAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
}
|
}
|
||||||
|
|
||||||
private MeteorSwarm(final MeteorSwarm card) {
|
private MeteorSwarm(final MeteorSwarm card) {
|
||||||
|
|
@ -37,20 +35,3 @@ public final class MeteorSwarm extends CardImpl {
|
||||||
return new MeteorSwarm(this);
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
|
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
|
||||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
import mage.abilities.hint.Hint;
|
|
||||||
import mage.abilities.hint.ValueHint;
|
import mage.abilities.hint.ValueHint;
|
||||||
import mage.abilities.mana.ManaAbility;
|
import mage.abilities.mana.ManaAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
|
|
@ -19,7 +18,7 @@ import mage.filter.predicate.Predicate;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.TargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -28,6 +27,13 @@ import java.util.UUID;
|
||||||
*/
|
*/
|
||||||
public final class MidnightArsonist extends CardImpl {
|
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) {
|
public MidnightArsonist(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
|
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.
|
// 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()
|
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"));
|
.setText("destroy up to X target artifacts without mana abilities, where X is the number of Vampires you control"));
|
||||||
ability.setTargetAdjuster(MidnightArsonistAdjuster.instance);
|
ability.setTargetAdjuster(new TargetsCountAdjuster(new PermanentsOnBattlefieldCount(filter)));
|
||||||
this.addAbility(ability.addHint(MidnightArsonistAdjuster.getHint()));
|
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) {
|
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> {
|
enum MidnightArsonistPredicate implements Predicate<Permanent> {
|
||||||
instance;
|
instance;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ import mage.game.Game;
|
||||||
import mage.game.permanent.token.ZombieToken;
|
import mage.game.permanent.token.ZombieToken;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// 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().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
|
||||||
this.getSpellAbility().addEffect(new MidnightRitualEffect());
|
this.getSpellAbility().addEffect(new MidnightRitualEffect());
|
||||||
this.getSpellAbility().setTargetAdjuster(MidnightRitualAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
}
|
}
|
||||||
|
|
||||||
private MidnightRitual(final MidnightRitual card) {
|
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 {
|
class MidnightRitualEffect extends OneShotEffect {
|
||||||
|
|
||||||
MidnightRitualEffect() {
|
MidnightRitualEffect() {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
|
@ -13,13 +12,11 @@ import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
import mage.constants.ComparisonType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.FilterPermanent;
|
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
import mage.filter.predicate.mageobject.PowerPredicate;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.game.Game;
|
import mage.target.targetadjustment.PowerTargetAdjuster;
|
||||||
import mage.target.Target;
|
|
||||||
import mage.target.TargetPermanent;
|
import java.util.UUID;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
@ -27,11 +24,7 @@ import mage.target.targetadjustment.TargetAdjuster;
|
||||||
*/
|
*/
|
||||||
public final class MinamoSightbender extends CardImpl {
|
public final class MinamoSightbender extends CardImpl {
|
||||||
|
|
||||||
private static final FilterPermanent filter = new FilterPermanent("creature with power X or less");
|
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power X or less");
|
||||||
|
|
||||||
static {
|
|
||||||
filter.add(CardType.CREATURE.getPredicate());
|
|
||||||
}
|
|
||||||
|
|
||||||
public MinamoSightbender(UUID ownerId, CardSetInfo setInfo) {
|
public MinamoSightbender(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
|
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.
|
// {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}"));
|
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBeBlockedTargetEffect(), new ManaCostsImpl<>("{X}"));
|
||||||
Target target = new TargetPermanent(filter);
|
ability.setTargetAdjuster(new PowerTargetAdjuster(ComparisonType.OR_LESS));
|
||||||
ability.setTargetAdjuster(MinamoSightbenderAdjuster.instance);
|
ability.addTarget(new TargetCreaturePermanent(filter));
|
||||||
ability.addTarget(target);
|
|
||||||
ability.addCost(new TapSourceCost());
|
ability.addCost(new TapSourceCost());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
|
|
||||||
|
|
@ -60,16 +52,3 @@ public final class MinamoSightbender extends CardImpl {
|
||||||
return new MinamoSightbender(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.costs.common.TapSourceCost;
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
|
|
@ -13,7 +12,9 @@ import mage.constants.CardType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.target.TargetPermanent;
|
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 ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{X}"));
|
||||||
ability.addCost(new TapSourceCost());
|
ability.addCost(new TapSourceCost());
|
||||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS));
|
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_LANDS));
|
||||||
ability.setTargetAdjuster(XTargetsAdjuster.instance);
|
ability.setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,8 @@ import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.TargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -42,7 +41,8 @@ public final class MogissMarauder extends CardImpl {
|
||||||
HasteAbility.getInstance(), Duration.EndOfTurn,
|
HasteAbility.getInstance(), Duration.EndOfTurn,
|
||||||
"and haste until end of turn, where X is your devotion to black"
|
"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());
|
ability.addHint(DevotionCount.B.getHint());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
@ -56,16 +56,3 @@ public final class MogissMarauder extends CardImpl {
|
||||||
return new MogissMarauder(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,20 +1,15 @@
|
||||||
|
|
||||||
package mage.cards.m;
|
package mage.cards.m;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
||||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
import mage.abilities.effects.common.GainLifeEffect;
|
import mage.abilities.effects.common.GainLifeEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.FilterPermanent;
|
|
||||||
import mage.filter.common.FilterArtifactOrEnchantmentPermanent;
|
|
||||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// 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 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().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) {
|
private Molder(final Molder card) {
|
||||||
|
|
@ -41,16 +37,3 @@ public final class Molder extends CardImpl {
|
||||||
return new Molder(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
package mage.cards.n;
|
package mage.cards.n;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.costs.VariableCost;
|
|
||||||
import mage.abilities.costs.common.DiscardXTargetCost;
|
import mage.abilities.costs.common.DiscardXTargetCost;
|
||||||
import mage.abilities.dynamicvalue.common.DiscardCostCardManaValue;
|
import mage.abilities.dynamicvalue.common.DiscardCostCardManaValue;
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
|
|
@ -10,10 +8,8 @@ import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.FilterCard;
|
||||||
import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreatureOrPlaneswalker;
|
import mage.target.common.TargetCreatureOrPlaneswalker;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -32,7 +28,8 @@ public final class NahirisWrath extends CardImpl {
|
||||||
Effect effect = new DamageTargetEffect(DiscardCostCardManaValue.instance);
|
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");
|
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().addEffect(effect);
|
||||||
this.getSpellAbility().setTargetAdjuster(NahirisWrathAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
|
this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker(0, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
private NahirisWrath(final NahirisWrath card) {
|
private NahirisWrath(final NahirisWrath card) {
|
||||||
|
|
@ -44,22 +41,3 @@ public final class NahirisWrath extends CardImpl {
|
||||||
return new NahirisWrath(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
package mage.cards.n;
|
package mage.cards.n;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.costs.common.DiscardXTargetCost;
|
import mage.abilities.costs.common.DiscardXTargetCost;
|
||||||
import mage.abilities.dynamicvalue.common.GetXValue;
|
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.common.ExileSpellEffect;
|
import mage.abilities.effects.common.ExileSpellEffect;
|
||||||
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
|
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
|
||||||
|
|
@ -11,9 +9,8 @@ import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.FilterCard;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -32,7 +29,8 @@ public final class NostalgicDreams extends CardImpl {
|
||||||
Effect effect = new ReturnFromGraveyardToHandTargetEffect();
|
Effect effect = new ReturnFromGraveyardToHandTargetEffect();
|
||||||
effect.setText("Return X target cards from your graveyard to your hand");
|
effect.setText("Return X target cards from your graveyard to your hand");
|
||||||
this.getSpellAbility().addEffect(effect);
|
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.
|
// Exile Nostalgic Dreams.
|
||||||
this.getSpellAbility().addEffect(new ExileSpellEffect());
|
this.getSpellAbility().addEffect(new ExileSpellEffect());
|
||||||
|
|
@ -47,16 +45,3 @@ public final class NostalgicDreams extends CardImpl {
|
||||||
return new NostalgicDreams(this);
|
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
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -11,9 +11,8 @@ import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -32,7 +31,8 @@ public final class OpenIntoWonder extends CardImpl {
|
||||||
Ability abilityToGain = new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1), false);
|
Ability abilityToGain = new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1), false);
|
||||||
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(abilityToGain, Duration.EndOfTurn,
|
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.\""));
|
"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) {
|
private OpenIntoWonder(final OpenIntoWonder card) {
|
||||||
|
|
@ -44,13 +44,3 @@ public final class OpenIntoWonder extends CardImpl {
|
||||||
return new OpenIntoWonder(this);
|
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()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -15,12 +15,11 @@ import mage.constants.Duration;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.EachOpponentPermanentTargetsAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -36,7 +35,8 @@ public final class OpenSeason extends CardImpl {
|
||||||
Effect effect = new AddCountersTargetEffect(CounterType.BOUNTY.createInstance());
|
Effect effect = new AddCountersTargetEffect(CounterType.BOUNTY.createInstance());
|
||||||
effect.setText("for each opponent, put a bounty counter on target creature that player controls");
|
effect.setText("for each opponent, put a bounty counter on target creature that player controls");
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(effect);
|
Ability ability = new EntersBattlefieldTriggeredAbility(effect);
|
||||||
ability.setTargetAdjuster(OpenSeasonAdjuster.instance);
|
ability.setTargetAdjuster(new EachOpponentPermanentTargetsAdjuster());
|
||||||
|
ability.addTarget(new TargetCreaturePermanent());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
|
|
||||||
// Creatures your opponent control with bounty counters on them can't activate abilities
|
// 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 {
|
class OpenSeasonRestrictionEffect extends RestrictionEffect {
|
||||||
|
|
||||||
OpenSeasonRestrictionEffect() {
|
OpenSeasonRestrictionEffect() {
|
||||||
|
|
|
||||||
|
|
@ -11,10 +11,8 @@ import mage.constants.Outcome;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
import mage.filter.predicate.permanent.BlockedPredicate;
|
import mage.filter.predicate.permanent.BlockedPredicate;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
|
||||||
import mage.players.Player;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -22,13 +20,19 @@ import java.util.UUID;
|
||||||
* @author jeffwadsworth
|
* @author jeffwadsworth
|
||||||
*/
|
*/
|
||||||
public final class Outmaneuver extends CardImpl {
|
public final class Outmaneuver extends CardImpl {
|
||||||
|
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(BlockedPredicate.instance);
|
||||||
|
}
|
||||||
|
|
||||||
public Outmaneuver(UUID ownerId, CardSetInfo setInfo) {
|
public Outmaneuver(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{R}");
|
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.
|
// X target blocked creatures assign their combat damage this turn as though they weren't blocked.
|
||||||
this.getSpellAbility().addEffect(new OutmaneuverEffect());
|
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) {
|
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 {
|
class OutmaneuverEffect extends AsThoughEffectImpl {
|
||||||
|
|
||||||
OutmaneuverEffect() {
|
OutmaneuverEffect() {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
|
|
||||||
package mage.cards.p;
|
package mage.cards.p;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||||
import mage.abilities.keyword.IslandwalkAbility;
|
import mage.abilities.keyword.IslandwalkAbility;
|
||||||
|
|
@ -9,9 +8,8 @@ import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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");
|
effect.setText("X target creatures gain islandwalk until end of turn");
|
||||||
this.getSpellAbility().getEffects().add(effect);
|
this.getSpellAbility().getEffects().add(effect);
|
||||||
this.getSpellAbility().getTargets().add(new TargetCreaturePermanent());
|
this.getSpellAbility().getTargets().add(new TargetCreaturePermanent());
|
||||||
this.getSpellAbility().setTargetAdjuster(PartWaterAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
}
|
}
|
||||||
|
|
||||||
private PartWater(final PartWater card) {
|
private PartWater(final PartWater card) {
|
||||||
|
|
@ -40,13 +38,3 @@ public final class PartWater extends CardImpl {
|
||||||
return new PartWater(this);
|
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()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.p;
|
package mage.cards.p;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.dynamicvalue.DynamicValue;
|
import mage.abilities.dynamicvalue.DynamicValue;
|
||||||
import mage.abilities.dynamicvalue.MultipliedValue;
|
import mage.abilities.dynamicvalue.MultipliedValue;
|
||||||
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
||||||
|
|
@ -10,10 +9,9 @@ import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.permanent.token.Pest11GainLifeToken;
|
import mage.game.permanent.token.Pest11GainLifeToken;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -32,7 +30,8 @@ public final class PestInfestation extends CardImpl {
|
||||||
.setText("destroy up to X target artifacts and/or enchantments."));
|
.setText("destroy up to X target artifacts and/or enchantments."));
|
||||||
this.getSpellAbility().addEffect(new CreateTokenEffect(new Pest11GainLifeToken(), xValue)
|
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.\""));
|
.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) {
|
private PestInfestation(final PestInfestation card) {
|
||||||
|
|
@ -44,16 +43,3 @@ public final class PestInfestation extends CardImpl {
|
||||||
return new PestInfestation(this);
|
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
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.p;
|
package mage.cards.p;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.ObjectColor;
|
import mage.ObjectColor;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
|
@ -16,7 +15,9 @@ import mage.filter.FilterPermanent;
|
||||||
import mage.filter.predicate.Predicates;
|
import mage.filter.predicate.Predicates;
|
||||||
import mage.filter.predicate.mageobject.ColorPredicate;
|
import mage.filter.predicate.mageobject.ColorPredicate;
|
||||||
import mage.target.TargetPermanent;
|
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.
|
// {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 ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl<>("{X}{X}{B}"));
|
||||||
ability.addTarget(new TargetPermanent(filter));
|
ability.addTarget(new TargetPermanent(filter));
|
||||||
ability.setTargetAdjuster(XCMCPermanentAdjuster.instance);
|
ability.setTargetAdjuster(new XManaValueTargetAdjuster());
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,16 +10,16 @@ import mage.abilities.keyword.HasteAbility;
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.CardType;
|
||||||
import mage.filter.FilterCard;
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.Outcome;
|
||||||
|
import mage.constants.Zone;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.common.FilterCreatureCard;
|
|
||||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
import mage.target.targetpointer.FixedTarget;
|
import mage.target.targetpointer.FixedTarget;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// 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().addEffect(new PostmortemLungeEffect());
|
||||||
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
|
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) {
|
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 {
|
class PostmortemLungeEffect extends OneShotEffect {
|
||||||
|
|
||||||
PostmortemLungeEffect() {
|
PostmortemLungeEffect() {
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ import mage.constants.Outcome;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.XTargetsAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
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.
|
// Choose a color. X target creatures gain protection from the chosen color until end of turn.
|
||||||
this.getSpellAbility().addEffect(new PrismaticBoonEffect());
|
this.getSpellAbility().addEffect(new PrismaticBoonEffect());
|
||||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||||
this.getSpellAbility().setTargetAdjuster(XTargetsAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
}
|
}
|
||||||
|
|
||||||
private PrismaticBoon(final PrismaticBoon card) {
|
private PrismaticBoon(final PrismaticBoon card) {
|
||||||
|
|
|
||||||
|
|
@ -4,18 +4,16 @@ package mage.cards.q;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldAbility;
|
import mage.abilities.common.EntersBattlefieldAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
|
import mage.abilities.dynamicvalue.common.CountersSourceCount;
|
||||||
import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
|
import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
|
||||||
import mage.abilities.effects.common.ExileUntilSourceLeavesEffect;
|
import mage.abilities.effects.common.ExileUntilSourceLeavesEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.TargetController;
|
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
import mage.filter.common.FilterNonlandPermanent;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.permanent.Permanent;
|
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.TargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -34,7 +32,8 @@ public final class QuarantineField extends CardImpl {
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new ExileUntilSourceLeavesEffect()
|
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")
|
.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);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -47,18 +46,3 @@ public final class QuarantineField extends CardImpl {
|
||||||
return new QuarantineField(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,9 @@
|
||||||
package mage.cards.q;
|
package mage.cards.q;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||||
import mage.abilities.costs.Cost;
|
|
||||||
import mage.abilities.costs.common.RemoveVariableCountersSourceCost;
|
import mage.abilities.costs.common.RemoveVariableCountersSourceCost;
|
||||||
import mage.abilities.costs.common.TapSourceCost;
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
import mage.abilities.costs.mana.GenericManaCost;
|
import mage.abilities.costs.mana.GenericManaCost;
|
||||||
|
|
@ -14,15 +12,15 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.ComparisonType;
|
import mage.constants.ComparisonType;
|
||||||
|
import mage.constants.SubType;
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
|
|
@ -46,7 +44,7 @@ public final class QuillmaneBaku extends CardImpl {
|
||||||
ability.addCost(new TapSourceCost());
|
ability.addCost(new TapSourceCost());
|
||||||
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.KI));
|
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.KI));
|
||||||
ability.addTarget(new TargetCreaturePermanent(filter));
|
ability.addTarget(new TargetCreaturePermanent(filter));
|
||||||
ability.setTargetAdjuster(QuillmaneBakuAdjuster.instance);
|
ability.setTargetAdjuster(new XManaValueTargetAdjuster(ComparisonType.OR_LESS));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,21 +57,3 @@ public final class QuillmaneBaku extends CardImpl {
|
||||||
return new QuillmaneBaku(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,12 @@
|
||||||
package mage.cards.r;
|
package mage.cards.r;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.common.ExileTargetEffect;
|
import mage.abilities.effects.common.ExileTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetCardInASingleGraveyard;
|
import mage.target.common.TargetCardInASingleGraveyard;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -22,7 +20,8 @@ public final class RatsFeast extends CardImpl {
|
||||||
|
|
||||||
// Exile X target cards from a single graveyard.
|
// Exile X target cards from a single graveyard.
|
||||||
this.getSpellAbility().addEffect(new ExileTargetEffect("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) {
|
private RatsFeast(final RatsFeast card) {
|
||||||
|
|
@ -34,14 +33,3 @@ public final class RatsFeast extends CardImpl {
|
||||||
return new RatsFeast(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package mage.cards.r;
|
package mage.cards.r;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Mode;
|
import mage.abilities.Mode;
|
||||||
import mage.abilities.effects.common.TapTargetEffect;
|
import mage.abilities.effects.common.TapTargetEffect;
|
||||||
import mage.abilities.effects.common.UntapTargetEffect;
|
import mage.abilities.effects.common.UntapTargetEffect;
|
||||||
|
|
@ -8,7 +7,9 @@ import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.target.TargetPermanent;
|
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 mode = new Mode(new UntapTargetEffect("untap X target permanents"));
|
||||||
mode.addTarget(new TargetPermanent());
|
mode.addTarget(new TargetPermanent());
|
||||||
this.getSpellAbility().addMode(mode);
|
this.getSpellAbility().addMode(mode);
|
||||||
this.getSpellAbility().setTargetAdjuster(XTargetsAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
}
|
}
|
||||||
|
|
||||||
private RealitySpasm(final RealitySpasm card) {
|
private RealitySpasm(final RealitySpasm card) {
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
package mage.cards.r;
|
package mage.cards.r;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
|
import mage.abilities.dynamicvalue.common.CountersSourceCount;
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
||||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||||
|
|
@ -17,7 +17,9 @@ import mage.constants.Zone;
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.target.TargetPermanent;
|
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 ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{U}"));
|
||||||
ability.addCost(new SacrificeSourceCost());
|
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.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);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetArtifactPermanent;
|
import mage.target.common.TargetArtifactPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
import mage.target.targetpointer.FixedTargets;
|
import mage.target.targetpointer.FixedTargets;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -32,8 +32,8 @@ public class RedSunsTwilight extends CardImpl {
|
||||||
// Destroy up to X target artifacts.
|
// 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.
|
// 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.
|
// Those tokens gain haste. Exile them at the beginning of the next end step.
|
||||||
this.getSpellAbility().addTarget(new TargetArtifactPermanent());
|
this.getSpellAbility().addTarget(new TargetArtifactPermanent(0, 1));
|
||||||
this.getSpellAbility().setTargetAdjuster(RedSunsTwilightAdjuster.instance);
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
this.getSpellAbility().addEffect(new RedSunsTwilightEffect());
|
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 {
|
class RedSunsTwilightEffect extends OneShotEffect {
|
||||||
|
|
||||||
RedSunsTwilightEffect() {
|
RedSunsTwilightEffect() {
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,15 @@
|
||||||
|
|
||||||
package mage.cards.r;
|
package mage.cards.r;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.permanent.token.GremlinToken;
|
import mage.game.permanent.token.GremlinToken;
|
||||||
import mage.target.common.TargetArtifactPermanent;
|
import mage.target.common.TargetArtifactPermanent;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -25,12 +23,12 @@ public final class ReleaseTheGremlins extends CardImpl {
|
||||||
|
|
||||||
// Destroy X target artifacts.
|
// Destroy X target artifacts.
|
||||||
this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target artifacts"));
|
this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target artifacts"));
|
||||||
|
this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster());
|
||||||
this.getSpellAbility().addTarget(new TargetArtifactPermanent());
|
this.getSpellAbility().addTarget(new TargetArtifactPermanent());
|
||||||
|
|
||||||
// Create X 2/2 red Gremlin creature tokens.
|
// Create X 2/2 red Gremlin creature tokens.
|
||||||
this.getSpellAbility().addEffect(new CreateTokenEffect(new GremlinToken(), ManacostVariableValue.REGULAR));
|
this.getSpellAbility().addEffect(new CreateTokenEffect(new GremlinToken(), ManacostVariableValue.REGULAR));
|
||||||
|
|
||||||
this.getSpellAbility().setTargetAdjuster(ReleaseTheGremlinsAdjuster.instance);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private ReleaseTheGremlins(final ReleaseTheGremlins card) {
|
private ReleaseTheGremlins(final ReleaseTheGremlins card) {
|
||||||
|
|
@ -42,13 +40,3 @@ public final class ReleaseTheGremlins extends CardImpl {
|
||||||
return new ReleaseTheGremlins(this);
|
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()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,19 +1,15 @@
|
||||||
package mage.cards.r;
|
package mage.cards.r;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.ComparisonType;
|
|
||||||
import mage.filter.common.FilterNonlandPermanent;
|
import mage.filter.common.FilterNonlandPermanent;
|
||||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.common.TargetNonlandPermanent;
|
import mage.target.targetadjustment.XManaValueTargetAdjuster;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
|
||||||
|
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.
|
// Return target nonland permanent with converted mana cost X to its owner's hand.
|
||||||
this.getSpellAbility().addEffect(new ReturnToHandTargetEffect());
|
this.getSpellAbility().addEffect(new ReturnToHandTargetEffect());
|
||||||
this.getSpellAbility().addTarget(new TargetPermanent(new FilterNonlandPermanent("nonland permanent with mana value X")));
|
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.
|
// Draw a card.
|
||||||
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));
|
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));
|
||||||
|
|
@ -42,16 +38,3 @@ public final class Repeal extends CardImpl {
|
||||||
return new Repeal(this);
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
package mage.cards.r;
|
package mage.cards.r;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.costs.Cost;
|
|
||||||
import mage.abilities.costs.common.DiscardXTargetCost;
|
import mage.abilities.costs.common.DiscardXTargetCost;
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
|
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
|
||||||
|
|
@ -9,11 +7,8 @@ import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.filter.StaticFilters;
|
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.common.TargetCardInYourGraveyard;
|
||||||
import mage.target.targetadjustment.TargetAdjuster;
|
import mage.target.targetadjustment.XTargetsCountAdjuster;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -32,8 +27,8 @@ public final class RestlessDreams extends CardImpl {
|
||||||
Effect effect = new ReturnFromGraveyardToHandTargetEffect();
|
Effect effect = new ReturnFromGraveyardToHandTargetEffect();
|
||||||
effect.setText("Return X target creature cards from your graveyard to your hand");
|
effect.setText("Return X target creature cards from your graveyard to your hand");
|
||||||
this.getSpellAbility().addEffect(effect);
|
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) {
|
private RestlessDreams(final RestlessDreams card) {
|
||||||
|
|
@ -45,22 +40,3 @@ public final class RestlessDreams extends CardImpl {
|
||||||
return new RestlessDreams(this);
|
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
Loading…
Add table
Add a link
Reference in a new issue