[XLN] refactor some TDFCs

This commit is contained in:
theelk801 2025-07-29 09:54:50 -04:00
parent f024e3b092
commit b70362416b
9 changed files with 98 additions and 255 deletions

View file

@ -1,8 +1,6 @@
package mage.cards.d; package mage.cards.d;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility; import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@ -13,16 +11,16 @@ import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.BoostEquippedEffect; import mage.abilities.effects.common.continuous.BoostEquippedEffect;
import mage.abilities.keyword.EquipAbility; import mage.abilities.keyword.EquipAbility;
import mage.abilities.keyword.TransformAbility; import mage.abilities.keyword.TransformAbility;
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.Outcome; import mage.constants.Outcome;
import mage.constants.Zone; import mage.constants.SubType;
import mage.game.permanent.token.DefenderPlantToken; import mage.game.permanent.token.DefenderPlantToken;
import mage.target.Target;
import mage.target.common.TargetOpponent; import mage.target.common.TargetOpponent;
import java.util.UUID;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -37,8 +35,7 @@ public final class DowsingDagger extends CardImpl {
// When Dowsing Dagger enters the battlefield, target opponent creates two 0/2 green Plant creature tokens with defender. // When Dowsing Dagger enters the battlefield, target opponent creates two 0/2 green Plant creature tokens with defender.
Ability ability = new EntersBattlefieldTriggeredAbility(new CreateTokenTargetEffect(new DefenderPlantToken(), 2), false); Ability ability = new EntersBattlefieldTriggeredAbility(new CreateTokenTargetEffect(new DefenderPlantToken(), 2), false);
Target target = new TargetOpponent(); ability.addTarget(new TargetOpponent());
ability.addTarget(target);
this.addAbility(ability); this.addAbility(ability);
// Equipped creature gets +2/+1. // Equipped creature gets +2/+1.

View file

@ -1,23 +1,19 @@
package mage.cards.l; package mage.cards.l;
import java.util.UUID; import mage.abilities.common.AttacksWithCreaturesTriggeredAbility;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility; import mage.abilities.keyword.TransformAbility;
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.CardType;
import mage.constants.Zone; import mage.constants.SuperType;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.token.IxalanVampireToken; import mage.game.permanent.token.IxalanVampireToken;
import java.util.UUID;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -35,7 +31,7 @@ public final class LegionsLanding extends CardImpl {
// When you attack with three or more creatures, transform Legion's Landing. // When you attack with three or more creatures, transform Legion's Landing.
this.addAbility(new TransformAbility()); this.addAbility(new TransformAbility());
this.addAbility(new LegionsLandingTriggeredAbility(new TransformSourceEffect())); this.addAbility(new AttacksWithCreaturesTriggeredAbility(new TransformSourceEffect(), 3).setTriggerPhrase("When you attack with three or more creatures, "));
} }
private LegionsLanding(final LegionsLanding card) { private LegionsLanding(final LegionsLanding card) {
@ -47,30 +43,3 @@ public final class LegionsLanding extends CardImpl {
return new LegionsLanding(this); return new LegionsLanding(this);
} }
} }
class LegionsLandingTriggeredAbility extends TriggeredAbilityImpl {
public LegionsLandingTriggeredAbility(Effect effect) {
super(Zone.BATTLEFIELD, effect, false);
setTriggerPhrase("When you attack with three or more creatures, " );
}
private LegionsLandingTriggeredAbility(final LegionsLandingTriggeredAbility ability) {
super(ability);
}
@Override
public LegionsLandingTriggeredAbility copy() {
return new LegionsLandingTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
return game.getCombat().getAttackers().size() >= 3 && game.getCombat().getAttackingPlayerId().equals(getControllerId());
}
}

View file

@ -1,17 +1,15 @@
package mage.cards.l; package mage.cards.l;
import java.util.UUID;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.mana.AddManaOfAnyColorEffect;
import mage.abilities.mana.SimpleManaAbility; import mage.abilities.mana.SimpleManaAbility;
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.Zone;
import java.util.UUID;
/** /**
*
* @author TheElk801 * @author TheElk801
*/ */
public final class LostVale extends CardImpl { public final class LostVale extends CardImpl {
@ -22,7 +20,7 @@ public final class LostVale extends CardImpl {
this.nightCard = true; this.nightCard = true;
// T: Add three mana of any one color. // T: Add three mana of any one color.
this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(3), new TapSourceCost())); this.addAbility(new SimpleManaAbility(new AddManaOfAnyColorEffect(3), new TapSourceCost()));
} }
private LostVale(final LostVale card) { private LostVale(final LostVale card) {

View file

@ -4,14 +4,13 @@ import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect; import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.TransformAbility; import mage.abilities.keyword.TransformAbility;
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.Outcome;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
@ -27,7 +26,7 @@ import java.util.UUID;
*/ */
public final class PrimalAmulet extends CardImpl { public final class PrimalAmulet extends CardImpl {
private static final FilterCard filter = new FilterCard("Instant and sorcery spells"); private static final FilterCard filter = new FilterCard("instant and sorcery spells");
static { static {
filter.add(Predicates.or( filter.add(Predicates.or(
@ -45,7 +44,12 @@ public final class PrimalAmulet extends CardImpl {
// Whenever you cast an instant or sorcery spell, put a charge counter on Primal Amulet. Then if there are four or more charge counters on it, you may remove those counters and transform it. // Whenever you cast an instant or sorcery spell, put a charge counter on Primal Amulet. Then if there are four or more charge counters on it, you may remove those counters and transform it.
this.addAbility(new TransformAbility()); this.addAbility(new TransformAbility());
this.addAbility(new SpellCastControllerTriggeredAbility(new PrimalAmuletEffect(), StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false)); Ability ability = new SpellCastControllerTriggeredAbility(
new AddCountersSourceEffect(CounterType.CHARGE.createInstance()),
StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false
);
ability.addEffect(new PrimalAmuletEffect());
this.addAbility(ability);
} }
private PrimalAmulet(final PrimalAmulet card) { private PrimalAmulet(final PrimalAmulet card) {
@ -62,9 +66,8 @@ class PrimalAmuletEffect extends OneShotEffect {
PrimalAmuletEffect() { PrimalAmuletEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "put a charge counter on {this}. " this.staticText = "Then if there are four or more charge counters on it, " +
+ "Then if there are four or more charge counters on it, " "you may remove those counters and transform it";
+ "you may remove those counters and transform it";
} }
private PrimalAmuletEffect(final PrimalAmuletEffect effect) { private PrimalAmuletEffect(final PrimalAmuletEffect effect) {
@ -79,16 +82,15 @@ class PrimalAmuletEffect extends OneShotEffect {
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId()); Player player = game.getPlayer(source.getControllerId());
Permanent permanent = game.getPermanent(source.getSourceId()); Permanent permanent = source.getSourcePermanentIfItStillExists(game);
if (permanent != null && player != null) { if (permanent == null
permanent.addCounters(CounterType.CHARGE.createInstance(), source.getControllerId(), source, game); || player == null
int counters = permanent.getCounters(game).getCount(CounterType.CHARGE); || permanent.getCounters(game).getCount(CounterType.CHARGE) <= 3
if (counters > 3 && player.chooseUse(Outcome.Benefit, "Transform this?", source, game)) { || !player.chooseUse(Outcome.Benefit, "Remove all charge counters from this and transform it?", source, game)) {
permanent.removeCounters(CounterType.CHARGE.getName(), counters, source, game); return false;
new TransformSourceEffect().apply(game, source);
}
return true;
} }
return false; permanent.removeAllCounters(CounterType.CHARGE.getName(), source, game);
permanent.transform(source, game);
return true;
} }
} }

View file

@ -1,7 +1,5 @@
package mage.cards.p; package mage.cards.p;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
@ -17,8 +15,9 @@ import mage.game.events.GameEvent;
import mage.game.stack.Spell; import mage.game.stack.Spell;
import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
/** /**
*
* @author TheElk801 * @author TheElk801
*/ */
public final class PrimalWellspring extends CardImpl { public final class PrimalWellspring extends CardImpl {
@ -33,9 +32,10 @@ public final class PrimalWellspring extends CardImpl {
this.addAbility(ability); this.addAbility(ability);
// When that mana is spent to cast an instant or sorcery spell, copy that spell and you may choose new targets for the copy. // When that mana is spent to cast an instant or sorcery spell, copy that spell and you may choose new targets for the copy.
Effect effect = new CopyTargetStackObjectEffect(true); this.addAbility(new PrimalWellspringTriggeredAbility(
effect.setText("copy that spell and you may choose new targets for the copy"); ability.getOriginalId(), new CopyTargetStackObjectEffect(true)
this.addAbility(new PyrimalWellspringTriggeredAbility(ability.getOriginalId(), effect)); .setText("copy that spell and you may choose new targets for the copy")
));
} }
private PrimalWellspring(final PrimalWellspring card) { private PrimalWellspring(final PrimalWellspring card) {
@ -48,26 +48,26 @@ public final class PrimalWellspring extends CardImpl {
} }
} }
class PyrimalWellspringTriggeredAbility extends TriggeredAbilityImpl { class PrimalWellspringTriggeredAbility extends TriggeredAbilityImpl {
private static final FilterInstantOrSorcerySpell filter = new FilterInstantOrSorcerySpell(); private static final FilterInstantOrSorcerySpell filter = new FilterInstantOrSorcerySpell();
String abilityOriginalId; String abilityOriginalId;
public PyrimalWellspringTriggeredAbility(UUID abilityOriginalId, Effect effect) { public PrimalWellspringTriggeredAbility(UUID abilityOriginalId, Effect effect) {
super(Zone.ALL, effect, false); super(Zone.ALL, effect, false);
this.abilityOriginalId = abilityOriginalId.toString(); this.abilityOriginalId = abilityOriginalId.toString();
setTriggerPhrase("When that mana is used to cast an instant or sorcery spell, "); setTriggerPhrase("When that mana is used to cast an instant or sorcery spell, ");
} }
private PyrimalWellspringTriggeredAbility(final PyrimalWellspringTriggeredAbility ability) { private PrimalWellspringTriggeredAbility(final PrimalWellspringTriggeredAbility ability) {
super(ability); super(ability);
this.abilityOriginalId = ability.abilityOriginalId; this.abilityOriginalId = ability.abilityOriginalId;
} }
@Override @Override
public PyrimalWellspringTriggeredAbility copy() { public PrimalWellspringTriggeredAbility copy() {
return new PyrimalWellspringTriggeredAbility(this); return new PrimalWellspringTriggeredAbility(this);
} }
@Override @Override

View file

@ -1,35 +1,30 @@
package mage.cards.s; package mage.cards.s;
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;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.RemoveFromCombatTargetEffect; import mage.abilities.effects.common.RemoveFromCombatTargetEffect;
import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.effects.common.UntapTargetEffect;
import mage.abilities.mana.ColorlessManaAbility; import mage.abilities.mana.ColorlessManaAbility;
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.filter.FilterPermanent;
import mage.constants.Zone; import mage.filter.common.FilterOpponentsCreaturePermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.AttackingPredicate; import mage.filter.predicate.permanent.AttackingPredicate;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
*
* @author TheElk801 * @author TheElk801
*/ */
public final class SpiresOfOrazca extends CardImpl { public final class SpiresOfOrazca extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("attacking creature an opponent controls"); private static final FilterPermanent filter = new FilterOpponentsCreaturePermanent("attacking creature an opponent controls");
static { static {
filter.add(AttackingPredicate.instance); filter.add(AttackingPredicate.instance);
filter.add(TargetController.OPPONENT.getControllerPredicate());
} }
public SpiresOfOrazca(UUID ownerId, CardSetInfo setInfo) { public SpiresOfOrazca(UUID ownerId, CardSetInfo setInfo) {
@ -40,12 +35,12 @@ public final class SpiresOfOrazca extends CardImpl {
this.addAbility(new ColorlessManaAbility()); this.addAbility(new ColorlessManaAbility());
// {T}: Untap target attacking creature an opponent controls and remove it from combat. // {T}: Untap target attacking creature an opponent controls and remove it from combat.
Effect effect = new UntapTargetEffect(); Ability ability = new SimpleActivatedAbility(
effect.setText("Untap target attacking creature an opponent controls and remove it from combat."); new UntapTargetEffect()
Ability ability = new SimpleActivatedAbility(effect, new TapSourceCost()); .setText("Untap target attacking creature an opponent controls"),
effect = new RemoveFromCombatTargetEffect(); new TapSourceCost()
effect.setText(" "); );
ability.addEffect(effect); ability.addEffect(new RemoveFromCombatTargetEffect().setText("and remove it from combat"));
ability.addTarget(new TargetPermanent(filter)); ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,27 +1,21 @@
package mage.cards.t; package mage.cards.t;
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.Cost;
import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.OneShotEffect; import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesToughness;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.BlackManaAbility;
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.SuperType; import mage.constants.SuperType;
import mage.constants.Zone;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player; import java.util.UUID;
import mage.target.common.TargetControlledCreaturePermanent;
/** /**
*
* @author TheElk801 * @author TheElk801
*/ */
public final class TempleOfAclazotz extends CardImpl { public final class TempleOfAclazotz extends CardImpl {
@ -36,7 +30,8 @@ public final class TempleOfAclazotz extends CardImpl {
this.addAbility(new BlackManaAbility()); this.addAbility(new BlackManaAbility());
// {T}, Sacrifice a creature: You gain life equal to the sacrificed creature's toughness. // {T}, Sacrifice a creature: You gain life equal to the sacrificed creature's toughness.
Ability ability = new SimpleActivatedAbility(new TempleOfAclazotzEffect(), new TapSourceCost()); Ability ability = new SimpleActivatedAbility(new GainLifeEffect(SacrificeCostCreaturesToughness.instance)
.setText("you gain life equal to the sacrificed creature's toughness"), new TapSourceCost());
ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_CREATURE)); ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_CREATURE));
this.addAbility(ability); this.addAbility(ability);
} }
@ -50,37 +45,3 @@ public final class TempleOfAclazotz extends CardImpl {
return new TempleOfAclazotz(this); return new TempleOfAclazotz(this);
} }
} }
class TempleOfAclazotzEffect extends OneShotEffect {
TempleOfAclazotzEffect() {
super(Outcome.GainLife);
this.staticText = "You gain life equal to the sacrificed creature's toughness";
}
private TempleOfAclazotzEffect(final TempleOfAclazotzEffect effect) {
super(effect);
}
@Override
public TempleOfAclazotzEffect copy() {
return new TempleOfAclazotzEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
for (Cost cost : source.getCosts()) {
if (cost instanceof SacrificeTargetCost) {
int amount = ((SacrificeTargetCost) cost).getPermanents().get(0).getToughness().getValue();
if (amount > 0) {
controller.gainLife(amount, game, source);
}
}
}
return true;
}
return false;
}
}

View file

@ -2,22 +2,22 @@ package mage.cards.t;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
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.effects.OneShotEffect; import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.RemoveAllCountersSourceEffect;
import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.keyword.ScryEffect;
import mage.abilities.keyword.TransformAbility; import mage.abilities.keyword.TransformAbility;
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.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.TreasureToken; import mage.game.permanent.token.TreasureToken;
import mage.players.Player;
import java.util.UUID; import java.util.UUID;
@ -26,6 +26,8 @@ import java.util.UUID;
*/ */
public final class TreasureMap extends CardImpl { public final class TreasureMap extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.LANDMARK, 3);
public TreasureMap(UUID ownerId, CardSetInfo setInfo) { public TreasureMap(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
@ -33,8 +35,13 @@ public final class TreasureMap extends CardImpl {
// {1}, {T}: Scry 1. Put a landmark counter on Treasure Map. Then if there are three or more landmark counters on it, remove those counters, transform Treasure Map, and create three colorless Treasure artifact tokens with "{T}, Sacrifice this artifact: Add one mana of any color." // {1}, {T}: Scry 1. Put a landmark counter on Treasure Map. Then if there are three or more landmark counters on it, remove those counters, transform Treasure Map, and create three colorless Treasure artifact tokens with "{T}, Sacrifice this artifact: Add one mana of any color."
this.addAbility(new TransformAbility()); this.addAbility(new TransformAbility());
Ability ability = new SimpleActivatedAbility(new TreasureMapEffect(), new ManaCostsImpl<>("{1}")); Ability ability = new SimpleActivatedAbility(new ScryEffect(1, false), new ManaCostsImpl<>("{1}"));
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
ability.addEffect(new AddCountersSourceEffect(CounterType.LANDMARK.createInstance()));
ability.addEffect(new ConditionalOneShotEffect(
new RemoveAllCountersSourceEffect(CounterType.LANDMARK), condition, "Then if there are three or " +
"more landmark counters on it, remove those counters, transform {this}, and create three Treasure tokens"
).addEffect(new TransformSourceEffect()).addEffect(new CreateTokenEffect(new TreasureToken(), 3)));
this.addAbility(ability); this.addAbility(ability);
} }
@ -47,43 +54,3 @@ public final class TreasureMap extends CardImpl {
return new TreasureMap(this); return new TreasureMap(this);
} }
} }
class TreasureMapEffect extends OneShotEffect {
TreasureMapEffect() {
super(Outcome.Benefit);
this.staticText = "Scry 1. Put a landmark counter on {this}. "
+ "Then if there are three or more landmark counters on it, "
+ "remove those counters, transform {this}, and create "
+ "three Treasure tokens";
}
private TreasureMapEffect(final TreasureMapEffect effect) {
super(effect);
}
@Override
public TreasureMapEffect copy() {
return new TreasureMapEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
Player player = game.getPlayer(source.getControllerId());
if (player != null) {
player.scry(1, source, game);
if (permanent != null) {
permanent.addCounters(CounterType.LANDMARK.createInstance(), source.getControllerId(), source, game);
int counters = permanent.getCounters(game).getCount(CounterType.LANDMARK);
if (counters > 2) {
permanent.removeCounters(CounterType.LANDMARK.getName(), counters, source, game);
new TransformSourceEffect().apply(game, source);
new CreateTokenEffect(new TreasureToken(), 3).apply(game, source);
}
return true;
}
}
return false;
}
}

View file

@ -3,21 +3,18 @@ package mage.cards.v;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility; import mage.abilities.keyword.TransformAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
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.*;
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.players.Player; import mage.players.Player;
import mage.target.targetpointer.FixedTarget; import mage.util.CardUtil;
import mage.watchers.common.CastSpellLastTurnWatcher; import mage.watchers.common.CastSpellLastTurnWatcher;
import java.util.UUID; import java.util.UUID;
@ -38,7 +35,7 @@ public final class VancesBlastingCannons extends CardImpl {
// Whenever you cast your third spell in a turn, transform Vance's Blasting Cannons. // Whenever you cast your third spell in a turn, transform Vance's Blasting Cannons.
this.addAbility(new TransformAbility()); this.addAbility(new TransformAbility());
this.addAbility(new VancesBlastingCannonsFlipTrigger()); this.addAbility(new VancesBlastingCannonsTriggeredAbility());
} }
private VancesBlastingCannons(final VancesBlastingCannons card) { private VancesBlastingCannons(final VancesBlastingCannons card) {
@ -69,72 +66,36 @@ class VancesBlastingCannonsExileEffect extends OneShotEffect {
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId()); Player player = game.getPlayer(source.getControllerId());
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (player == null) {
if (controller != null && sourcePermanent != null) { return false;
Card card = controller.getLibrary().getFromTop(game); }
if (card != null) { Card card = player.getLibrary().getFromTop(game);
String exileName = sourcePermanent.getIdName() + (card.isLand(game) ? "" : " <this card may be cast the turn it was exiled"); if (card == null) {
controller.moveCardsToExile(card, source, game, true, source.getSourceId(), exileName); return false;
if (game.getState().getZone(card.getId()) == Zone.EXILED && !card.isLand(game)) { }
ContinuousEffect effect = new CastFromNonHandZoneTargetEffect(Duration.EndOfTurn); player.moveCards(card, Zone.EXILED, source, game);
effect.setTargetPointer(new FixedTarget(card, game)); if (!card.isLand(game)) {
game.addEffect(effect, source); CardUtil.makeCardPlayable(game, source, card, true, Duration.EndOfTurn, false);
}
}
return true;
} }
return false;
}
}
class CastFromNonHandZoneTargetEffect extends AsThoughEffectImpl {
CastFromNonHandZoneTargetEffect(Duration duration) {
super(AsThoughEffectType.CAST_FROM_NOT_OWN_HAND_ZONE, duration, Outcome.Benefit);
staticText = "If it's a nonland card, you may cast that card this turn";
}
private CastFromNonHandZoneTargetEffect(final CastFromNonHandZoneTargetEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
return true; return true;
} }
@Override
public CastFromNonHandZoneTargetEffect copy() {
return new CastFromNonHandZoneTargetEffect(this);
}
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
if (getTargetPointer().getTargets(game, source).contains(objectId)
&& source.isControlledBy(affectedControllerId)) {
Card card = game.getCard(objectId);
if (card != null) {
return true;
}
}
return false;
}
} }
class VancesBlastingCannonsFlipTrigger extends TriggeredAbilityImpl { class VancesBlastingCannonsTriggeredAbility extends TriggeredAbilityImpl {
public VancesBlastingCannonsFlipTrigger() { public VancesBlastingCannonsTriggeredAbility() {
super(Zone.BATTLEFIELD, new TransformSourceEffect(), true); super(Zone.BATTLEFIELD, new TransformSourceEffect(), true);
setTriggerPhrase("Whenever you cast your third spell in a turn, ");
} }
private VancesBlastingCannonsFlipTrigger(final VancesBlastingCannonsFlipTrigger ability) { private VancesBlastingCannonsTriggeredAbility(final VancesBlastingCannonsTriggeredAbility ability) {
super(ability); super(ability);
} }
@Override @Override
public VancesBlastingCannonsFlipTrigger copy() { public VancesBlastingCannonsTriggeredAbility copy() {
return new VancesBlastingCannonsFlipTrigger(this); return new VancesBlastingCannonsTriggeredAbility(this);
} }
@Override @Override
@ -144,17 +105,10 @@ class VancesBlastingCannonsFlipTrigger extends TriggeredAbilityImpl {
@Override @Override
public boolean checkTrigger(GameEvent event, Game game) { public boolean checkTrigger(GameEvent event, Game game) {
if (event.getPlayerId().equals(controllerId)) { return isControlledBy(event.getPlayerId())
CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class); && game
if (watcher != null && watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(event.getPlayerId()) == 3) { .getState()
return true; .getWatcher(CastSpellLastTurnWatcher.class)
} .getAmountOfSpellsPlayerCastOnCurrentTurn(event.getPlayerId()) == 3;
}
return false;
}
@Override
public String getRule() {
return "Whenever you cast your third spell in a turn, you may transform {this}";
} }
} }