reimplement more cards to use BecomesTargetSource

This commit is contained in:
xenohedron 2023-09-21 01:40:51 -04:00
parent 8f92a23302
commit 2a210404a2
9 changed files with 66 additions and 428 deletions

View file

@ -1,25 +1,19 @@
package mage.cards.a;
import java.util.UUID;
import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.BecomesTargetSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.LoseLifeTargetEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.ColorPredicate;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
/**
*
@ -35,7 +29,6 @@ public final class AshenmoorLiege extends CardImpl {
filterRedCreature.add(new ColorPredicate(ObjectColor.RED));
}
public AshenmoorLiege(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{B/R}{B/R}{B/R}");
this.subtype.add(SubType.ELEMENTAL);
@ -50,10 +43,8 @@ public final class AshenmoorLiege extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filterRedCreature, true)));
// Whenever Ashenmoor Liege becomes the target of a spell or ability an opponent controls, that player loses 4 life.
this.addAbility(new AshenmoorLiegeTriggeredAbility());
this.addAbility(new BecomesTargetSourceTriggeredAbility(new LoseLifeTargetEffect(4),
StaticFilters.FILTER_SPELL_OR_ABILITY_OPPONENTS, SetTargetPointer.PLAYER, false));
}
private AshenmoorLiege(final AshenmoorLiege card) {
@ -65,39 +56,3 @@ public final class AshenmoorLiege extends CardImpl {
return new AshenmoorLiege(this);
}
}
class AshenmoorLiegeTriggeredAbility extends TriggeredAbilityImpl {
public AshenmoorLiegeTriggeredAbility() {
super(Zone.BATTLEFIELD, new LoseLifeTargetEffect(4), false);
}
private AshenmoorLiegeTriggeredAbility(final AshenmoorLiegeTriggeredAbility ability) {
super(ability);
}
@Override
public AshenmoorLiegeTriggeredAbility copy() {
return new AshenmoorLiegeTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TARGETED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getTargetId().equals(this.getSourceId()) && game.getOpponents(this.controllerId).contains(event.getPlayerId())) {
getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId()));
return true;
}
return false;
}
@Override
public String getRule() {
return "Whenever {this} becomes the target of a spell or ability an opponent controls, that player loses 4 life.";
}
}

View file

@ -1,10 +1,8 @@
package mage.cards.e;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.BecomesTargetSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.common.ExileSourceEffect;
@ -12,9 +10,10 @@ import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import java.util.UUID;
/**
*
@ -33,7 +32,8 @@ public final class EternalScourge extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.EXILED, new EternalScourgePlayEffect()));
// When Eternal Scourge becomes the target of a spell or ability an opponent controls, exile Eternal Scourge.
this.addAbility(new EternalScourgeAbility());
this.addAbility(new BecomesTargetSourceTriggeredAbility(new ExileSourceEffect(),
StaticFilters.FILTER_SPELL_OR_ABILITY_OPPONENTS));
}
private EternalScourge(final EternalScourge card) {
@ -78,37 +78,3 @@ class EternalScourgePlayEffect extends AsThoughEffectImpl {
return false;
}
}
class EternalScourgeAbility extends TriggeredAbilityImpl {
public EternalScourgeAbility() {
super(Zone.BATTLEFIELD, new ExileSourceEffect(), false);
}
private EternalScourgeAbility(final EternalScourgeAbility ability) {
super(ability);
}
@Override
public EternalScourgeAbility copy() {
return new EternalScourgeAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TARGETED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getTargetId().equals(this.getSourceId()) && game.getOpponents(this.controllerId).contains(event.getPlayerId())) {
return true;
}
return false;
}
@Override
public String getRule() {
return "Whenever {this} becomes the target of a spell or ability an opponent controls, exile {this}.";
}
}

View file

@ -1,20 +1,19 @@
package mage.cards.f;
import mage.MageInt;
import mage.MageObject;
import mage.MageObjectReference;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.BecomesTargetSourceTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.ShuffleIntoLibrarySourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.events.EntersTheBattlefieldEvent;
import mage.game.events.GameEvent;
import mage.game.stack.Spell;
import mage.target.targetpointer.FixedTarget;
import mage.watchers.Watcher;
import java.util.HashSet;
@ -38,7 +37,8 @@ public final class FblthpTheLost extends CardImpl {
this.addAbility(new FblthpTheLostTriggeredAbility());
// When Fblthp becomes the target of a spell, shuffle Fblthp into its owner's library.
this.addAbility(new FblthpTheLostTargetedTriggeredAbility());
this.addAbility(new BecomesTargetSourceTriggeredAbility(new ShuffleIntoLibrarySourceEffect(),
StaticFilters.FILTER_SPELL_A));
}
private FblthpTheLost(final FblthpTheLost card) {
@ -128,40 +128,3 @@ class FblthpTheLostWatcher extends Watcher {
}
}
class FblthpTheLostTargetedTriggeredAbility extends TriggeredAbilityImpl {
FblthpTheLostTargetedTriggeredAbility() {
super(Zone.BATTLEFIELD, new ShuffleIntoLibrarySourceEffect(), false);
}
private FblthpTheLostTargetedTriggeredAbility(final FblthpTheLostTargetedTriggeredAbility ability) {
super(ability);
}
@Override
public FblthpTheLostTargetedTriggeredAbility copy() {
return new FblthpTheLostTargetedTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TARGETED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
MageObject eventSourceObject = game.getObject(event.getSourceId());
if (event.getTargetId().equals(this.getSourceId()) && eventSourceObject instanceof Spell) {
getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId()));
return true;
}
return false;
}
@Override
public String getRule() {
return "When {this} becomes the target of a spell, shuffle {this} into its owner's library.";
}
}

View file

@ -1,28 +1,19 @@
package mage.cards.f;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.BecomesTargetSourceTriggeredAbility;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.LoseLifeTargetEffect;
import mage.abilities.effects.common.continuous.CantGainLifeAllEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SuperType;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.stack.Spell;
import mage.target.targetpointer.FixedTarget;
import mage.constants.*;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
*
* @author fireshoes
* @author xenohedron
*/
public final class ForsakenWastes extends CardImpl {
@ -31,13 +22,15 @@ public final class ForsakenWastes extends CardImpl {
this.supertype.add(SuperType.WORLD);
// Players can't gain life.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantGainLifeAllEffect()));
this.addAbility(new SimpleStaticAbility(new CantGainLifeAllEffect()));
// At the beginning of each player's upkeep, that player loses 1 life.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new LoseLifeTargetEffect(1), TargetController.ANY, false, true));
this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new LoseLifeTargetEffect(1),
TargetController.ANY, false, true));
// Whenever Forsaken Wastes becomes the target of a spell, that spell's controller loses 5 life.
this.addAbility(new ForsakenWastesTriggeredAbility());
this.addAbility(new BecomesTargetSourceTriggeredAbility(new LoseLifeTargetEffect(5),
StaticFilters.FILTER_SPELL_A, SetTargetPointer.PLAYER, false));
}
private ForsakenWastes(final ForsakenWastes card) {
@ -49,40 +42,3 @@ public final class ForsakenWastes extends CardImpl {
return new ForsakenWastes(this);
}
}
class ForsakenWastesTriggeredAbility extends TriggeredAbilityImpl {
public ForsakenWastesTriggeredAbility() {
super(Zone.BATTLEFIELD, new LoseLifeTargetEffect(5), false);
}
private ForsakenWastesTriggeredAbility(final ForsakenWastesTriggeredAbility ability) {
super(ability);
}
@Override
public ForsakenWastesTriggeredAbility copy() {
return new ForsakenWastesTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TARGETED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
MageObject eventSourceObject = game.getObject(event.getSourceId());
if (event.getTargetId().equals(this.getSourceId()) && eventSourceObject instanceof Spell) {
getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId()));
return true;
}
return false;
}
@Override
public String getRule() {
return "Whenever {this} becomes the target of a spell, that spell's controller loses 5 life.";
}
}

View file

@ -1,10 +1,7 @@
package mage.cards.l;
import java.util.UUID;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.BecomesTargetSourceTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.abilities.keyword.EmbalmAbility;
@ -12,16 +9,12 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.stack.Spell;
import mage.target.targetpointer.FixedTarget;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
*
* @author fireshoes
* @author xenohedron
*/
public final class LabyrinthGuardian extends CardImpl {
@ -34,7 +27,7 @@ public final class LabyrinthGuardian extends CardImpl {
this.toughness = new MageInt(3);
// When Labyrinth Guardian becomes the target of a spell, sacrifice it.
this.addAbility(new LabyrinthGuardianTriggeredAbility());
this.addAbility(new BecomesTargetSourceTriggeredAbility(new SacrificeSourceEffect(), StaticFilters.FILTER_SPELL_A));
// Embalm {3}{U}
this.addAbility(new EmbalmAbility(new ManaCostsImpl<>("{3}{U}"), this));
@ -50,40 +43,3 @@ public final class LabyrinthGuardian extends CardImpl {
return new LabyrinthGuardian(this);
}
}
class LabyrinthGuardianTriggeredAbility extends TriggeredAbilityImpl {
public LabyrinthGuardianTriggeredAbility() {
super(Zone.BATTLEFIELD, new SacrificeSourceEffect(), false);
}
private LabyrinthGuardianTriggeredAbility(final LabyrinthGuardianTriggeredAbility ability) {
super(ability);
}
@Override
public LabyrinthGuardianTriggeredAbility copy() {
return new LabyrinthGuardianTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TARGETED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
MageObject eventSourceObject = game.getObject(event.getSourceId());
if (event.getTargetId().equals(this.getSourceId()) && eventSourceObject instanceof Spell) {
getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId()));
return true;
}
return false;
}
@Override
public String getRule() {
return "When {this} becomes the target of a spell, sacrifice it.";
}
}

View file

@ -1,26 +1,20 @@
package mage.cards.l;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.BecomesTargetSourceTriggeredAbility;
import mage.abilities.effects.common.SacrificeEffect;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SetTargetPointer;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterLandPermanent;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.target.targetpointer.FixedTarget;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
*
* @author LoneFox
* @author xenohedron
*/
public final class LavaRunner extends CardImpl {
@ -32,8 +26,11 @@ public final class LavaRunner extends CardImpl {
// Haste
this.addAbility(HasteAbility.getInstance());
// Whenever Lava Runner becomes the target of a spell or ability, that spell or ability's controller sacrifices a land.
this.addAbility(new LavaRunnerAbility());
this.addAbility(new BecomesTargetSourceTriggeredAbility(
new SacrificeEffect(StaticFilters.FILTER_LAND_A, 1, "that spell or ability's controller"),
StaticFilters.FILTER_SPELL_OR_ABILITY_A, SetTargetPointer.PLAYER, false));
}
private LavaRunner(final LavaRunner card) {
@ -45,38 +42,3 @@ public final class LavaRunner extends CardImpl {
return new LavaRunner(this);
}
}
class LavaRunnerAbility extends TriggeredAbilityImpl {
public LavaRunnerAbility() {
super(Zone.BATTLEFIELD, new SacrificeEffect(new FilterLandPermanent(), 1, ""), false);
}
private LavaRunnerAbility(final LavaRunnerAbility ability) {
super(ability);
}
@Override
public LavaRunnerAbility copy() {
return new LavaRunnerAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TARGETED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if(event.getTargetId().equals(this.getSourceId())) {
getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId()));
return true;
}
return false;
}
@Override
public String getRule() {
return "Whenever {this} becomes the target of a spell or ability, that spell or ability's controller sacrifices a land.";
}
}

View file

@ -1,23 +1,19 @@
package mage.cards.m;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.BecomesTargetSourceTriggeredAbility;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
*
* @author fireshoes & L_J
* @author xenohedron
*/
public final class Mossdog extends CardImpl {
@ -29,7 +25,8 @@ public final class Mossdog extends CardImpl {
this.toughness = new MageInt(1);
// Whenever Mossdog becomes the target of a spell or ability an opponent controls, put a +1/+1 counter on Mossdog.
this.addAbility(new MossdogAbility());
this.addAbility(new BecomesTargetSourceTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
StaticFilters.FILTER_SPELL_OR_ABILITY_OPPONENTS));
}
private Mossdog(final Mossdog card) {
@ -41,37 +38,3 @@ public final class Mossdog extends CardImpl {
return new Mossdog(this);
}
}
class MossdogAbility extends TriggeredAbilityImpl {
public MossdogAbility() {
super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false);
}
private MossdogAbility(final MossdogAbility ability) {
super(ability);
}
@Override
public MossdogAbility copy() {
return new MossdogAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TARGETED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getTargetId().equals(this.getSourceId()) && game.getOpponents(this.controllerId).contains(event.getPlayerId())) {
return true;
}
return false;
}
@Override
public String getRule() {
return "Whenever {this} becomes the target of a spell or ability an opponent controls, put a +1/+1 counter on {this}.";
}
}

View file

@ -1,25 +1,19 @@
package mage.cards.r;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect;
import mage.abilities.common.BecomesTargetSourceTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SetTargetPointer;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.permanent.Permanent;
import mage.target.targetpointer.FixedTarget;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
*
* @author L_J
* @author xenohedron
*/
public final class Retromancer extends CardImpl {
@ -31,7 +25,8 @@ public final class Retromancer extends CardImpl {
this.toughness = new MageInt(3);
// Whenever Retromancer becomes the target of a spell or ability, Retromancer deals 3 damage to that spell or ability's controller.
this.addAbility(new RetromancerTriggeredAbility(new DamageTargetEffect(3)));
this.addAbility(new BecomesTargetSourceTriggeredAbility(new DamageTargetEffect(3),
StaticFilters.FILTER_SPELL_OR_ABILITY_A, SetTargetPointer.PLAYER, false));
}
private Retromancer(final Retromancer card) {
@ -43,41 +38,3 @@ public final class Retromancer extends CardImpl {
return new Retromancer(this);
}
}
class RetromancerTriggeredAbility extends TriggeredAbilityImpl {
public RetromancerTriggeredAbility(Effect effect) {
super(Zone.BATTLEFIELD, effect);
}
private RetromancerTriggeredAbility(final RetromancerTriggeredAbility ability) {
super(ability);
}
@Override
public RetromancerTriggeredAbility copy() {
return new RetromancerTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TARGETED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Permanent creature = game.getPermanent(event.getTargetId());
if (creature != null && event.getTargetId().equals(getSourceId())) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return true;
}
return false;
}
@Override
public String getRule() {
return "Whenever {this} becomes the target of a spell or ability, {this} deals 3 damage to that spell or ability's controller.";
}
}

View file

@ -1,16 +1,11 @@
package mage.game.permanent.token;
import mage.MageInt;
import mage.abilities.common.BecomesTargetSourceTriggeredAbility;
import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.stack.Spell;
import mage.filter.StaticFilters;
/**
* @author TheElk801
@ -26,10 +21,11 @@ public final class JaceCunningCastawayIllusionToken extends TokenImpl {
power = new MageInt(2);
toughness = new MageInt(2);
this.addAbility(new IllusionTokenTriggeredAbility());
this.addAbility(new BecomesTargetSourceTriggeredAbility(new SacrificeSourceEffect().setText("sacrifice it"), StaticFilters.FILTER_SPELL_A)
.setTriggerPhrase("When this creature becomes the target of a spell, "));
}
protected JaceCunningCastawayIllusionToken(final JaceCunningCastawayIllusionToken token) {
private JaceCunningCastawayIllusionToken(final JaceCunningCastawayIllusionToken token) {
super(token);
}
@ -38,39 +34,3 @@ public final class JaceCunningCastawayIllusionToken extends TokenImpl {
return new JaceCunningCastawayIllusionToken(this);
}
}
class IllusionTokenTriggeredAbility extends TriggeredAbilityImpl {
public IllusionTokenTriggeredAbility() {
super(Zone.BATTLEFIELD, new SacrificeSourceEffect(), false);
}
protected IllusionTokenTriggeredAbility(final IllusionTokenTriggeredAbility ability) {
super(ability);
}
@Override
public IllusionTokenTriggeredAbility copy() {
return new IllusionTokenTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TARGETED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
MageObject eventSourceObject = game.getObject(event.getSourceId());
if (event.getTargetId().equals(this.getSourceId()) && eventSourceObject instanceof Spell) {
return true;
}
return false;
}
@Override
public String getRule() {
return "When this creature becomes the target of a spell, sacrifice it.";
}
}