From 6abe9ff821dda7070549bdb3e59b2c49c4d0521c Mon Sep 17 00:00:00 2001 From: xenohedron Date: Thu, 21 Sep 2023 00:19:12 -0400 Subject: [PATCH] new common BecomesTargetAnyTriggeredAbility --- Mage.Sets/src/mage/cards/b/BattleMammoth.java | 8 +- Mage.Sets/src/mage/cards/c/CloudCover.java | 69 +++---------- Mage.Sets/src/mage/cards/c/Cowardice.java | 53 ++-------- .../src/mage/cards/d/DaruSpiritualist.java | 56 ++--------- .../src/mage/cards/d/DiffusionSliver.java | 62 ++---------- .../mage/cards/e/ElrondMasterOfHealing.java | 17 +--- Mage.Sets/src/mage/cards/f/FeySteed.java | 85 +++++----------- .../src/mage/cards/h/HorobiDeathsWail.java | 53 ++-------- Mage.Sets/src/mage/cards/j/JumpTrooper.java | 70 ++----------- .../mage/cards/k/KingOfTheOathbreakers.java | 4 +- .../src/mage/cards/m/MilaCraftyCompanion.java | 6 +- .../src/mage/cards/s/ShapersSanctuary.java | 60 ++---------- .../src/mage/cards/s/SilverfurPartisan.java | 79 ++++----------- Mage.Sets/src/mage/cards/s/SwarmShambler.java | 54 ++--------- .../src/mage/cards/t/ThunderbreakRegent.java | 73 +++----------- .../src/mage/cards/v/VeneratedRotpriest.java | 63 +++--------- Mage.Sets/src/mage/cards/w/WildDefiance.java | 68 ++----------- .../BecomesTargetAnyTriggeredAbility.java | 97 +++++++++++++++++++ ...omesTargetOpponentAllTriggeredAbility.java | 83 ---------------- .../common/BecomesTargetTriggeredAbility.java | 73 -------------- 20 files changed, 257 insertions(+), 876 deletions(-) create mode 100644 Mage/src/main/java/mage/abilities/common/BecomesTargetAnyTriggeredAbility.java delete mode 100644 Mage/src/main/java/mage/abilities/common/BecomesTargetOpponentAllTriggeredAbility.java delete mode 100644 Mage/src/main/java/mage/abilities/common/BecomesTargetTriggeredAbility.java diff --git a/Mage.Sets/src/mage/cards/b/BattleMammoth.java b/Mage.Sets/src/mage/cards/b/BattleMammoth.java index 27095dc028a..d5f86b409b6 100644 --- a/Mage.Sets/src/mage/cards/b/BattleMammoth.java +++ b/Mage.Sets/src/mage/cards/b/BattleMammoth.java @@ -1,14 +1,16 @@ package mage.cards.b; import mage.MageInt; -import mage.abilities.common.BecomesTargetOpponentAllTriggeredAbility; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.keyword.ForetellAbility; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SetTargetPointer; import mage.constants.SubType; +import mage.filter.StaticFilters; import java.util.UUID; @@ -28,8 +30,8 @@ public final class BattleMammoth extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // Whenever a permanent you control becomes the target of a spell or ability an opponent controls, you may draw a card. - this.addAbility(new BecomesTargetOpponentAllTriggeredAbility( - new DrawCardSourceControllerEffect(1), true + this.addAbility(new BecomesTargetAnyTriggeredAbility(new DrawCardSourceControllerEffect(1), + StaticFilters.FILTER_CONTROLLED_A_PERMANENT, StaticFilters.FILTER_SPELL_OR_ABILITY_OPPONENTS, SetTargetPointer.NONE, true )); // Foretell {2}{G}{G} diff --git a/Mage.Sets/src/mage/cards/c/CloudCover.java b/Mage.Sets/src/mage/cards/c/CloudCover.java index 79d6553ad70..e6f80ec18ae 100644 --- a/Mage.Sets/src/mage/cards/c/CloudCover.java +++ b/Mage.Sets/src/mage/cards/c/CloudCover.java @@ -1,31 +1,35 @@ - package mage.cards.c; -import java.util.UUID; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -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.players.Player; -import mage.target.targetpointer.FixedTarget; +import mage.constants.SetTargetPointer; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; + +import java.util.UUID; /** * - * @author fireshoes + * @author xenohedron */ public final class CloudCover extends CardImpl { + private static final FilterPermanent filter = new FilterControlledPermanent("another permanent you control"); + static { + filter.add(AnotherPredicate.instance); + } + public CloudCover(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{W}{U}"); // Whenever another permanent you control becomes the target of a spell or ability an opponent controls, you may return that permanent to its owner's hand. - this.addAbility(new CloudCoverAbility()); + this.addAbility(new BecomesTargetAnyTriggeredAbility(new ReturnToHandTargetEffect(), + filter, StaticFilters.FILTER_SPELL_OR_ABILITY_OPPONENTS, SetTargetPointer.PERMANENT, true)); } private CloudCover(final CloudCover card) { @@ -37,44 +41,3 @@ public final class CloudCover extends CardImpl { return new CloudCover(this); } } - -class CloudCoverAbility extends TriggeredAbilityImpl { - - public CloudCoverAbility() { - super(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), true); - } - - private CloudCoverAbility(final CloudCoverAbility ability) { - super(ability); - } - - @Override - public CloudCoverAbility copy() { - return new CloudCoverAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Permanent permanent = game.getPermanent(event.getTargetId()); - Player controller = game.getPlayer(this.getControllerId()); - if (permanent != null - && permanent.isControlledBy(getControllerId()) - && !permanent.getId().equals(this.getSourceId()) - && controller != null - && controller.hasOpponent(event.getPlayerId(), game)) { - getEffects().get(0).setTargetPointer(new FixedTarget(permanent, game)); - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever another permanent you control becomes the target of a spell or ability an opponent controls, you may return that permanent to its owner's hand."; - } -} diff --git a/Mage.Sets/src/mage/cards/c/Cowardice.java b/Mage.Sets/src/mage/cards/c/Cowardice.java index b3c8219bc9e..2440ca90769 100644 --- a/Mage.Sets/src/mage/cards/c/Cowardice.java +++ b/Mage.Sets/src/mage/cards/c/Cowardice.java @@ -1,21 +1,16 @@ - package mage.cards.c; -import java.util.UUID; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.target.targetpointer.FixedTarget; +import mage.filter.StaticFilters; + +import java.util.UUID; /** - * - * @author dustinconrad + * @author xenohedron */ public final class Cowardice extends CardImpl { @@ -23,7 +18,7 @@ public final class Cowardice extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{U}{U}"); // Whenever a creature becomes the target of a spell or ability, return that creature to its owner's hand. - this.addAbility(new CowardiceTriggeredAbility()); + this.addAbility(new BecomesTargetAnyTriggeredAbility(new ReturnToHandTargetEffect(), StaticFilters.FILTER_PERMANENT_A_CREATURE)); } private Cowardice(final Cowardice card) { @@ -35,39 +30,3 @@ public final class Cowardice extends CardImpl { return new Cowardice(this); } } - -class CowardiceTriggeredAbility extends TriggeredAbilityImpl { - - public CowardiceTriggeredAbility() { - super(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), false); - } - - private CowardiceTriggeredAbility(final CowardiceTriggeredAbility ability) { - super(ability); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && permanent.isCreature(game)) { - getEffects().get(0).setTargetPointer(new FixedTarget(event.getTargetId(), game)); - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever a creature becomes the target of a spell or ability, return that creature to its owner's hand."; - } - - @Override - public CowardiceTriggeredAbility copy() { - return new CowardiceTriggeredAbility(this); - } -} diff --git a/Mage.Sets/src/mage/cards/d/DaruSpiritualist.java b/Mage.Sets/src/mage/cards/d/DaruSpiritualist.java index 244e13e3987..6121b15037f 100644 --- a/Mage.Sets/src/mage/cards/d/DaruSpiritualist.java +++ b/Mage.Sets/src/mage/cards/d/DaruSpiritualist.java @@ -1,27 +1,25 @@ package mage.cards.d; -import java.util.UUID; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.effects.common.continuous.BoostTargetEffect; 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.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.target.targetpointer.FixedTarget; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; + +import java.util.UUID; /** - * - * @author L_J + * @author xenohedron */ public final class DaruSpiritualist extends CardImpl { + private static final FilterPermanent filter = new FilterControlledCreaturePermanent(SubType.CLERIC, "a Cleric creature you control"); + public DaruSpiritualist(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); this.subtype.add(SubType.HUMAN); @@ -31,7 +29,7 @@ public final class DaruSpiritualist extends CardImpl { this.toughness = new MageInt(1); // Whenever a Cleric creature you control becomes the target of a spell or ability, it gets +0/+2 until end of turn. - this.addAbility(new DaruSpiritualistTriggeredAbility(new BoostTargetEffect(0, 2, Duration.EndOfTurn))); + this.addAbility(new BecomesTargetAnyTriggeredAbility(new BoostTargetEffect(0, 2, Duration.EndOfTurn), filter)); } private DaruSpiritualist(final DaruSpiritualist card) { @@ -43,39 +41,3 @@ public final class DaruSpiritualist extends CardImpl { return new DaruSpiritualist(this); } } - -class DaruSpiritualistTriggeredAbility extends TriggeredAbilityImpl { - - public DaruSpiritualistTriggeredAbility(Effect effect) { - super(Zone.BATTLEFIELD, effect); - } - - private DaruSpiritualistTriggeredAbility(final DaruSpiritualistTriggeredAbility ability) { - super(ability); - } - - @Override - public DaruSpiritualistTriggeredAbility copy() { - return new DaruSpiritualistTriggeredAbility(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 && creature.hasSubtype(SubType.CLERIC, game) && creature.getControllerId().equals(getControllerId()) && creature.isCreature(game)) { - this.getEffects().setTargetPointer(new FixedTarget(creature, game)); - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever a Cleric creature you control becomes the target of a spell or ability, it gets +0/+2 until end of turn."; - } -} diff --git a/Mage.Sets/src/mage/cards/d/DiffusionSliver.java b/Mage.Sets/src/mage/cards/d/DiffusionSliver.java index 6ea1e05da49..e4451da52a3 100644 --- a/Mage.Sets/src/mage/cards/d/DiffusionSliver.java +++ b/Mage.Sets/src/mage/cards/d/DiffusionSliver.java @@ -1,29 +1,27 @@ package mage.cards.d; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.CounterUnlessPaysEffect; 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.FilterPermanent; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.target.targetpointer.FixedTarget; import java.util.UUID; /** - * @author LevelX2 + * @author xenohedron */ public final class DiffusionSliver extends CardImpl { + private static final FilterPermanent filter = new FilterControlledCreaturePermanent(SubType.SLIVER, "a Sliver creature you control"); + public DiffusionSliver(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); this.subtype.add(SubType.SLIVER); @@ -32,7 +30,8 @@ public final class DiffusionSliver extends CardImpl { this.toughness = new MageInt(1); // Whenever a Sliver creature you control becomes the target of a spell or ability an opponent controls, counter that spell or ability unless its controller pays {2}. - this.addAbility(new DiffusionSliverTriggeredAbility()); + this.addAbility(new BecomesTargetAnyTriggeredAbility(new CounterUnlessPaysEffect(new GenericManaCost(2)), + filter, StaticFilters.FILTER_SPELL_OR_ABILITY_OPPONENTS, SetTargetPointer.SPELL, false)); } private DiffusionSliver(final DiffusionSliver card) { @@ -44,48 +43,3 @@ public final class DiffusionSliver extends CardImpl { return new DiffusionSliver(this); } } - -class DiffusionSliverTriggeredAbility extends TriggeredAbilityImpl { - - private static final FilterPermanent filter = new FilterControlledCreaturePermanent(SubType.SLIVER); - - DiffusionSliverTriggeredAbility() { - super(Zone.BATTLEFIELD, null); - } - - private DiffusionSliverTriggeredAbility(final DiffusionSliverTriggeredAbility ability) { - super(ability); - } - - @Override - public DiffusionSliverTriggeredAbility copy() { - return new DiffusionSliverTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (!game.getOpponents(this.controllerId).contains(event.getPlayerId())) { - return false; - } - Permanent creature = game.getPermanent(event.getTargetId()); - if (creature == null || !filter.match(creature, getControllerId(), this, game)) { - return false; - } - this.getEffects().clear(); - Effect effect = new CounterUnlessPaysEffect(new GenericManaCost(2)); - effect.setTargetPointer(new FixedTarget(event.getSourceId(), game)); - this.addEffect(effect); - return true; - } - - @Override - public String getRule() { - return "Whenever a Sliver creature you control becomes the target of a spell or ability an opponent controls, " + - "counter that spell or ability unless its controller pays {2}."; - } -} diff --git a/Mage.Sets/src/mage/cards/e/ElrondMasterOfHealing.java b/Mage.Sets/src/mage/cards/e/ElrondMasterOfHealing.java index 8b394ce3735..77509c6b7a9 100644 --- a/Mage.Sets/src/mage/cards/e/ElrondMasterOfHealing.java +++ b/Mage.Sets/src/mage/cards/e/ElrondMasterOfHealing.java @@ -2,18 +2,18 @@ package mage.cards.e; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.BecomesTargetOpponentAllTriggeredAbility; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.common.ScryTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SetTargetPointer; import mage.constants.SubType; import mage.constants.SuperType; import mage.counters.CounterType; -import mage.filter.FilterPermanent; -import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.target.common.TargetCreaturePermanent; import mage.target.targetadjustment.TargetAdjuster; @@ -25,13 +25,6 @@ import java.util.UUID; */ public final class ElrondMasterOfHealing extends CardImpl { - private static final FilterPermanent filter - = new FilterControlledCreaturePermanent("a creature you control with a +1/+1 counter on it"); - - static { - filter.add(CounterType.P1P1.getPredicate()); - } - public ElrondMasterOfHealing(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{U}"); @@ -48,8 +41,8 @@ public final class ElrondMasterOfHealing extends CardImpl { .setTargetAdjuster(ElrondMasterOfHealingAdjuster.instance)); // 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 BecomesTargetOpponentAllTriggeredAbility( - new DrawCardSourceControllerEffect(1), filter, true + this.addAbility(new BecomesTargetAnyTriggeredAbility(new DrawCardSourceControllerEffect(1), + StaticFilters.FILTER_A_CONTROLLED_CREATURE_P1P1, StaticFilters.FILTER_SPELL_OR_ABILITY_OPPONENTS, SetTargetPointer.NONE, true )); } diff --git a/Mage.Sets/src/mage/cards/f/FeySteed.java b/Mage.Sets/src/mage/cards/f/FeySteed.java index 9618e16beec..beaecd6abeb 100644 --- a/Mage.Sets/src/mage/cards/f/FeySteed.java +++ b/Mage.Sets/src/mage/cards/f/FeySteed.java @@ -1,28 +1,24 @@ package mage.cards.f; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.IndestructibleAbility; -import mage.constants.SubType; -import mage.constants.TargetController; -import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.AnotherPredicate; -import mage.filter.predicate.permanent.AttackingPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; +import mage.constants.*; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.AnotherPredicate; +import mage.filter.predicate.permanent.AttackingPredicate; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; /** * @@ -30,13 +26,18 @@ import mage.constants.Duration; */ public final class FeySteed extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent( - "another target attacking creature you control"); + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target attacking creature you control"); + private static final FilterControlledPermanent filter2 = new FilterControlledPermanent("a creature or planeswalker you control"); static { filter.add(TargetController.YOU.getControllerPredicate()); filter.add(AnotherPredicate.instance); filter.add(AttackingPredicate.instance); + + filter2.add(Predicates.or( + CardType.CREATURE.getPredicate(), + CardType.PLANESWALKER.getPredicate() + )); } public FeySteed(UUID ownerId, CardSetInfo setInfo) { @@ -46,16 +47,15 @@ public final class FeySteed extends CardImpl { this.power = new MageInt(4); this.toughness = new MageInt(4); - // Whenever Fey Steed attacks, another target attacking creature you control - // gains indestructible until end of turn. + // Whenever Fey Steed attacks, another target attacking creature you control gains indestructible until end of turn. Ability ability = new AttacksTriggeredAbility( new GainAbilityTargetEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn), false); ability.addTarget(new TargetCreaturePermanent(filter)); this.addAbility(ability); - // Whenever a creature or planeswalker you control becomes the target of a spell - // or ability an opponent controls, you may draw a card. - this.addAbility(new FeySteedTriggeredAbility()); + // Whenever a creature or planeswalker you control becomes the target of a spell or ability an opponent controls, you may draw a card. + this.addAbility(new BecomesTargetAnyTriggeredAbility(new DrawCardSourceControllerEffect(1), + filter2, StaticFilters.FILTER_SPELL_OR_ABILITY_OPPONENTS, SetTargetPointer.NONE, true)); } private FeySteed(final FeySteed card) { @@ -67,44 +67,3 @@ public final class FeySteed extends CardImpl { return new FeySteed(this); } } - -class FeySteedTriggeredAbility extends TriggeredAbilityImpl { - - public FeySteedTriggeredAbility() { - super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), true); - } - - private FeySteedTriggeredAbility(final FeySteedTriggeredAbility ability) { - super(ability); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Player targetter = game.getPlayer(event.getPlayerId()); - if (targetter == null || !targetter.hasOpponent(this.controllerId, game)) { - return false; - } - - Permanent permanent = game.getPermanentOrLKIBattlefield(event.getTargetId()); - if (permanent == null || !permanent.isControlledBy(this.getControllerId()) - || (!permanent.isCreature(game) && !permanent.isPlaneswalker(game))) { - return false; - } - return true; - } - - @Override - public String getRule() { - return "Whenever a creature or planeswalker you control becomes the target of a spell or ability an opponent controls, you may draw a card."; - } - - @Override - public FeySteedTriggeredAbility copy() { - return new FeySteedTriggeredAbility(this); - } -} diff --git a/Mage.Sets/src/mage/cards/h/HorobiDeathsWail.java b/Mage.Sets/src/mage/cards/h/HorobiDeathsWail.java index 267c22f9b85..289d6504247 100644 --- a/Mage.Sets/src/mage/cards/h/HorobiDeathsWail.java +++ b/Mage.Sets/src/mage/cards/h/HorobiDeathsWail.java @@ -1,9 +1,7 @@ package mage.cards.h; -import java.util.UUID; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -11,15 +9,12 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.SuperType; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.target.targetpointer.FixedTarget; +import mage.filter.StaticFilters; + +import java.util.UUID; /** - * - * @author LevelX + * @author xenohedron */ public final class HorobiDeathsWail extends CardImpl { @@ -35,7 +30,7 @@ public final class HorobiDeathsWail extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever a creature becomes the target of a spell or ability, destroy that creature. - this.addAbility(new HorobiDeathsWailAbility(new DestroyTargetEffect())); + this.addAbility(new BecomesTargetAnyTriggeredAbility(new DestroyTargetEffect(), StaticFilters.FILTER_PERMANENT_A_CREATURE)); } private HorobiDeathsWail(final HorobiDeathsWail card) { @@ -48,39 +43,3 @@ public final class HorobiDeathsWail extends CardImpl { } } - -class HorobiDeathsWailAbility extends TriggeredAbilityImpl { - - public HorobiDeathsWailAbility(Effect effect) { - super(Zone.BATTLEFIELD, effect); - } - - private HorobiDeathsWailAbility(final HorobiDeathsWailAbility ability) { - super(ability); - } - - @Override - public HorobiDeathsWailAbility copy() { - return new HorobiDeathsWailAbility(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 && creature.isCreature(game)) { - getEffects().get(0).setTargetPointer(new FixedTarget(event.getTargetId(), game)); - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever a creature becomes the target of a spell or ability, destroy that creature."; - } -} diff --git a/Mage.Sets/src/mage/cards/j/JumpTrooper.java b/Mage.Sets/src/mage/cards/j/JumpTrooper.java index c480508d453..becfa48239a 100644 --- a/Mage.Sets/src/mage/cards/j/JumpTrooper.java +++ b/Mage.Sets/src/mage/cards/j/JumpTrooper.java @@ -1,23 +1,18 @@ - package mage.cards.j; -import java.util.UUID; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.CounterUnlessPaysEffect; 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.StaticFilters; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.common.FilterCreatureCard; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.target.TargetStackObject; + +import java.util.UUID; /** * @@ -25,7 +20,7 @@ import mage.target.TargetStackObject; */ public final class JumpTrooper extends CardImpl { - private static final FilterCreatureCard filter = new FilterCreatureCard("Trooper creatures"); + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a Trooper creature you control"); static { filter.add(SubType.TROOPER.getPredicate()); @@ -38,8 +33,10 @@ public final class JumpTrooper extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(1); - // Whenever a Trooper creature you control becomes the target of a spell or ability an opponent controls, counter that spell or abitlity unless its controller pays {2}. - this.addAbility(new JumpTrooperTriggeredAbility(new CounterUnlessPaysEffect(new GenericManaCost(2)))); + // Whenever a Trooper creature you control becomes the target of a spell or ability an opponent controls, counter that spell or ability unless its controller pays {2}. + this.addAbility(new BecomesTargetAnyTriggeredAbility(new CounterUnlessPaysEffect(new GenericManaCost(2)) + .setText("counter that spell or ability unless its controller pays {2}"), + filter, StaticFilters.FILTER_SPELL_OR_ABILITY_OPPONENTS, SetTargetPointer.SPELL, false)); } @@ -52,50 +49,3 @@ public final class JumpTrooper extends CardImpl { return new JumpTrooper(this); } } - -class JumpTrooperTriggeredAbility extends TriggeredAbilityImpl { - - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Trooper creature you control"); - - static { - filter.add(SubType.TROOPER.getPredicate()); - } - - public JumpTrooperTriggeredAbility(Effect effect) { - super(Zone.BATTLEFIELD, effect); - } - - private JumpTrooperTriggeredAbility(final JumpTrooperTriggeredAbility ability) { - super(ability); - } - - @Override - public JumpTrooperTriggeredAbility copy() { - return new JumpTrooperTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (game.getOpponents(this.controllerId).contains(event.getPlayerId())) { - Permanent creature = game.getPermanent(event.getTargetId()); - if (creature != null && filter.match(creature, getControllerId(), this, game)) { - this.getTargets().clear(); - TargetStackObject target = new TargetStackObject(); - target.add(event.getSourceId(), game); - this.addTarget(target); - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a Trooper creature you control becomes the target of a spell or ability an opponent controls, counter that spell or ability unless its controller pays {2}."; - } -} diff --git a/Mage.Sets/src/mage/cards/k/KingOfTheOathbreakers.java b/Mage.Sets/src/mage/cards/k/KingOfTheOathbreakers.java index 1d6f0e712b7..c9187f04f7f 100644 --- a/Mage.Sets/src/mage/cards/k/KingOfTheOathbreakers.java +++ b/Mage.Sets/src/mage/cards/k/KingOfTheOathbreakers.java @@ -1,7 +1,7 @@ package mage.cards.k; import mage.MageInt; -import mage.abilities.common.BecomesTargetTriggeredAbility; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.common.PhaseInTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.PhaseOutTargetEffect; @@ -43,7 +43,7 @@ public final class KingOfTheOathbreakers extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever King of the Oathbreakers or another Spirit you control becomes the target of a spell, it phases out. - this.addAbility(new BecomesTargetTriggeredAbility( + this.addAbility(new BecomesTargetAnyTriggeredAbility( new PhaseOutTargetEffect("it"), filter, StaticFilters.FILTER_SPELL_A )); diff --git a/Mage.Sets/src/mage/cards/m/MilaCraftyCompanion.java b/Mage.Sets/src/mage/cards/m/MilaCraftyCompanion.java index a5283caa4ce..8ea82fa23b2 100644 --- a/Mage.Sets/src/mage/cards/m/MilaCraftyCompanion.java +++ b/Mage.Sets/src/mage/cards/m/MilaCraftyCompanion.java @@ -3,7 +3,7 @@ package mage.cards.m; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.common.BecomesTargetOpponentAllTriggeredAbility; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.common.delayed.AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -52,8 +52,8 @@ public final class MilaCraftyCompanion extends ModalDoubleFacedCard { this.getLeftHalfCard().addAbility(new MilaCraftyCompanionTriggeredAbility()); // Whenever a permanent you control becomes the target of a spell or ability and opponent controls, you may draw a card. - this.getLeftHalfCard().addAbility(new BecomesTargetOpponentAllTriggeredAbility( - new DrawCardSourceControllerEffect(1), true + this.getLeftHalfCard().addAbility(new BecomesTargetAnyTriggeredAbility(new DrawCardSourceControllerEffect(1), + StaticFilters.FILTER_CONTROLLED_A_PERMANENT, StaticFilters.FILTER_SPELL_OR_ABILITY_OPPONENTS, SetTargetPointer.NONE, true )); // 2. diff --git a/Mage.Sets/src/mage/cards/s/ShapersSanctuary.java b/Mage.Sets/src/mage/cards/s/ShapersSanctuary.java index 3a6e44ca46b..858b69eaf18 100644 --- a/Mage.Sets/src/mage/cards/s/ShapersSanctuary.java +++ b/Mage.Sets/src/mage/cards/s/ShapersSanctuary.java @@ -1,22 +1,17 @@ - package mage.cards.s; -import java.util.UUID; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.players.Player; +import mage.constants.SetTargetPointer; +import mage.filter.StaticFilters; + +import java.util.UUID; /** - * - * @author TheElk801 + * @author xenohedron */ public final class ShapersSanctuary extends CardImpl { @@ -24,7 +19,9 @@ public final class ShapersSanctuary extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{G}"); // Whenever a creature you control becomes the target of a spell or ability an opponent controls, you may draw a card. - this.addAbility(new CreaturesYouControlTargetedTriggeredAbility(new DrawCardSourceControllerEffect(1))); + this.addAbility(new BecomesTargetAnyTriggeredAbility(new DrawCardSourceControllerEffect(1), + StaticFilters.FILTER_CONTROLLED_A_CREATURE, StaticFilters.FILTER_SPELL_OR_ABILITY_OPPONENTS, + SetTargetPointer.NONE, true)); } private ShapersSanctuary(final ShapersSanctuary card) { @@ -36,42 +33,3 @@ public final class ShapersSanctuary extends CardImpl { return new ShapersSanctuary(this); } } - -class CreaturesYouControlTargetedTriggeredAbility extends TriggeredAbilityImpl { - - public CreaturesYouControlTargetedTriggeredAbility(Effect effect) { - super(Zone.BATTLEFIELD, effect, true); - } - - private CreaturesYouControlTargetedTriggeredAbility(final CreaturesYouControlTargetedTriggeredAbility ability) { - super(ability); - } - - @Override - public CreaturesYouControlTargetedTriggeredAbility copy() { - return new CreaturesYouControlTargetedTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Permanent permanent = game.getPermanentOrLKIBattlefield(event.getTargetId()); - Player targetter = game.getPlayer(event.getPlayerId()); - if (permanent != null && permanent.isControlledBy(this.getControllerId()) && permanent.isCreature(game)) { - Object object = game.getObject(event.getSourceId()); - if (object != null && targetter != null && targetter.hasOpponent(this.getControllerId(), game)) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a creature you control becomes the target of a spell or ability an opponent controls, you may draw a card."; - } -} diff --git a/Mage.Sets/src/mage/cards/s/SilverfurPartisan.java b/Mage.Sets/src/mage/cards/s/SilverfurPartisan.java index 572f31e3cb0..2858c80c79b 100644 --- a/Mage.Sets/src/mage/cards/s/SilverfurPartisan.java +++ b/Mage.Sets/src/mage/cards/s/SilverfurPartisan.java @@ -1,30 +1,35 @@ package mage.cards.s; import mage.MageInt; -import mage.MageObject; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.TrampleAbility; 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.permanent.Permanent; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.Predicates; import mage.game.permanent.token.WolfToken; -import mage.game.stack.StackObject; -import mage.target.targetpointer.FixedTarget; import java.util.UUID; /** - * @author fireshoes + * @author xenohedron */ public final class SilverfurPartisan extends CardImpl { + private static final FilterPermanent filter = new FilterControlledPermanent("a Wolf or Werewolf you control"); + + static { + filter.add(Predicates.or( + SubType.WOLF.getPredicate(), + SubType.WEREWOLF.getPredicate() + )); + } + public SilverfurPartisan(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); this.subtype.add(SubType.WOLF); @@ -36,7 +41,8 @@ public final class SilverfurPartisan extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // Whenever a Wolf or Werewolf you control becomes the target of an instant or sorcery spell, create a 2/2 green Wolf creature token. - this.addAbility(new CreaturesYouControlBecomesTargetTriggeredAbility(new CreateTokenEffect(new WolfToken()))); + this.addAbility(new BecomesTargetAnyTriggeredAbility(new CreateTokenEffect(new WolfToken()), + filter, StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY)); } private SilverfurPartisan(final SilverfurPartisan card) { @@ -48,54 +54,3 @@ public final class SilverfurPartisan extends CardImpl { return new SilverfurPartisan(this); } } - -class CreaturesYouControlBecomesTargetTriggeredAbility extends TriggeredAbilityImpl { - - public CreaturesYouControlBecomesTargetTriggeredAbility(Effect effect) { - super(Zone.BATTLEFIELD, effect); - } - - private CreaturesYouControlBecomesTargetTriggeredAbility(final CreaturesYouControlBecomesTargetTriggeredAbility ability) { - super(ability); - } - - @Override - public CreaturesYouControlBecomesTargetTriggeredAbility copy() { - return new CreaturesYouControlBecomesTargetTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Permanent permanent = game.getPermanent(event.getTargetId()); - MageObject object = game.getObject(event.getSourceId()); - if (permanent != null - && object != null - && permanent.isControlledBy(this.controllerId) - && (permanent.hasSubtype(SubType.WOLF, game) - || permanent.hasSubtype(SubType.WEREWOLF, game))) { - if (object instanceof StackObject) { - if (object.isInstant(game) - || object.isSorcery(game)) { - if (getTargets().isEmpty()) { - for (Effect effect : getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getTargetId(), game)); - } - } - return true; - } - } - } - - return false; - } - - @Override - public String getRule() { - return "Whenever a Wolf or Werewolf you control becomes the target of an instant or sorcery spell, create a 2/2 green Wolf creature token."; - } -} diff --git a/Mage.Sets/src/mage/cards/s/SwarmShambler.java b/Mage.Sets/src/mage/cards/s/SwarmShambler.java index d54acb9165d..3f998b5bf48 100644 --- a/Mage.Sets/src/mage/cards/s/SwarmShambler.java +++ b/Mage.Sets/src/mage/cards/s/SwarmShambler.java @@ -2,7 +2,7 @@ package mage.cards.s; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; @@ -13,14 +13,11 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Zone; +import mage.constants.TargetController; import mage.counters.CounterType; +import mage.filter.FilterSpell; import mage.filter.StaticFilters; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; import mage.game.permanent.token.InsectToken; -import mage.game.stack.Spell; import java.util.UUID; @@ -29,6 +26,11 @@ import java.util.UUID; */ public final class SwarmShambler extends CardImpl { + private static final FilterSpell filter = new FilterSpell("a spell an opponent controls"); + static { + filter.add(TargetController.OPPONENT.getControllerPredicate()); + } + public SwarmShambler(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); @@ -44,7 +46,8 @@ public final class SwarmShambler extends CardImpl { )); // Whenever a creature you control with a +1/+1 counter on it becomes the target of a spell an opponent controls, create a 1/1 green Insect creature token. - this.addAbility(new SwarmShamblerTriggeredAbility()); + this.addAbility(new BecomesTargetAnyTriggeredAbility(new CreateTokenEffect(new InsectToken()), + StaticFilters.FILTER_A_CONTROLLED_CREATURE_P1P1, filter)); // {1}, {T}: Put a +1/+1 counter on Swarm Shambler. Ability ability = new SimpleActivatedAbility( @@ -63,40 +66,3 @@ public final class SwarmShambler extends CardImpl { return new SwarmShambler(this); } } - -class SwarmShamblerTriggeredAbility extends TriggeredAbilityImpl { - - SwarmShamblerTriggeredAbility() { - super(Zone.BATTLEFIELD, new CreateTokenEffect(new InsectToken()), false); - } - - private SwarmShamblerTriggeredAbility(final SwarmShamblerTriggeredAbility ability) { - super(ability); - } - - @Override - public SwarmShamblerTriggeredAbility copy() { - return new SwarmShamblerTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Spell sourceObject = game.getSpell(event.getSourceId()); - Permanent permanent = game.getPermanent(event.getTargetId()); - return sourceObject != null - && permanent != null - && StaticFilters.FILTER_CONTROLLED_CREATURE_P1P1.match(permanent, getControllerId(), this, game) - && StaticFilters.FILTER_SPELL_OR_ABILITY_OPPONENTS.match(sourceObject, getControllerId(), this, game); - } - - @Override - public String getRule() { - return "Whenever a creature you control with a +1/+1 counter on it " + - "becomes the target of a spell an opponent controls, create a 1/1 green Insect creature token."; - } -} diff --git a/Mage.Sets/src/mage/cards/t/ThunderbreakRegent.java b/Mage.Sets/src/mage/cards/t/ThunderbreakRegent.java index c5e4f80ffaa..54a2d11e2ea 100644 --- a/Mage.Sets/src/mage/cards/t/ThunderbreakRegent.java +++ b/Mage.Sets/src/mage/cards/t/ThunderbreakRegent.java @@ -1,29 +1,29 @@ - package mage.cards.t; -import java.util.UUID; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.keyword.FlyingAbility; 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.FilterControlledCreaturePermanent; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.target.targetpointer.FixedTarget; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledPermanent; + +import java.util.UUID; /** - * - * @author LevelX2 + * @author xenohedron */ public final class ThunderbreakRegent extends CardImpl { + private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Dragon you control"); + static { + filter.add(SubType.DRAGON.getPredicate()); + } + public ThunderbreakRegent(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}{R}"); this.subtype.add(SubType.DRAGON); @@ -34,7 +34,8 @@ public final class ThunderbreakRegent extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever a Dragon you control becomes the target of a spell or ability your opponent controls, Thunderbreak Regent deals 3 damage to that player. - this.addAbility(new ThunderbreakRegentTriggeredAbility(new DamageTargetEffect(3))); + this.addAbility(new BecomesTargetAnyTriggeredAbility(new DamageTargetEffect(3), + filter, StaticFilters.FILTER_SPELL_OR_ABILITY_OPPONENTS, SetTargetPointer.PLAYER, false)); } private ThunderbreakRegent(final ThunderbreakRegent card) { @@ -46,49 +47,3 @@ public final class ThunderbreakRegent extends CardImpl { return new ThunderbreakRegent(this); } } - -class ThunderbreakRegentTriggeredAbility extends TriggeredAbilityImpl { - - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Sliver creature you control"); - - static { - filter.add(SubType.DRAGON.getPredicate()); - } - - public ThunderbreakRegentTriggeredAbility(Effect effect) { - super(Zone.BATTLEFIELD, effect); - } - - private ThunderbreakRegentTriggeredAbility(final ThunderbreakRegentTriggeredAbility ability) { - super(ability); - } - - @Override - public ThunderbreakRegentTriggeredAbility copy() { - return new ThunderbreakRegentTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (game.getOpponents(this.controllerId).contains(event.getPlayerId())) { - Permanent creature = game.getPermanent(event.getTargetId()); - if (creature != null && filter.match(creature, getControllerId(), this, game)) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getPlayerId())); - } - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a Dragon you control becomes the target of a spell or ability an opponent controls, {this} deals 3 damage to that player."; - } -} diff --git a/Mage.Sets/src/mage/cards/v/VeneratedRotpriest.java b/Mage.Sets/src/mage/cards/v/VeneratedRotpriest.java index 3f65f7521cf..f9ecc19d3b7 100644 --- a/Mage.Sets/src/mage/cards/v/VeneratedRotpriest.java +++ b/Mage.Sets/src/mage/cards/v/VeneratedRotpriest.java @@ -1,28 +1,22 @@ package mage.cards.v; -import java.util.UUID; - import mage.MageInt; -import mage.MageObject; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.common.FightTargetSourceEffect; +import mage.abilities.Ability; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.effects.common.counter.AddPoisonCounterTargetEffect; -import mage.constants.SubType; import mage.abilities.keyword.ToxicAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Zone; +import mage.constants.SetTargetPointer; +import mage.constants.SubType; import mage.filter.StaticFilters; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.game.stack.Spell; -import mage.target.TargetPermanent; import mage.target.common.TargetOpponent; +import java.util.UUID; + /** - * @author TheElk801 + * @author xenohedron */ public final class VeneratedRotpriest extends CardImpl { @@ -38,7 +32,10 @@ public final class VeneratedRotpriest extends CardImpl { this.addAbility(new ToxicAbility(1)); // Whenever a creature you control becomes the target of a spell, target opponent gets a poison counter. - this.addAbility(new VeneratedRotpriestTriggeredAbility()); + Ability ability = new BecomesTargetAnyTriggeredAbility(new AddPoisonCounterTargetEffect(1), + StaticFilters.FILTER_CONTROLLED_A_CREATURE, StaticFilters.FILTER_SPELL_A, SetTargetPointer.NONE, false); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); } private VeneratedRotpriest(final VeneratedRotpriest card) { @@ -50,41 +47,3 @@ public final class VeneratedRotpriest extends CardImpl { return new VeneratedRotpriest(this); } } - -class VeneratedRotpriestTriggeredAbility extends TriggeredAbilityImpl { - - VeneratedRotpriestTriggeredAbility() { - super(Zone.BATTLEFIELD, new AddPoisonCounterTargetEffect(1)); - this.addTarget(new TargetOpponent()); - } - - private VeneratedRotpriestTriggeredAbility(final VeneratedRotpriestTriggeredAbility ability) { - super(ability); - } - - @Override - public VeneratedRotpriestTriggeredAbility copy() { - return new VeneratedRotpriestTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Permanent permanent = game.getPermanent(event.getTargetId()); - MageObject object = game.getObject(event.getSourceId()); - return permanent != null - && object != null - && isControlledBy(permanent.getControllerId()) - && permanent.isCreature(game) - && object instanceof Spell; - } - - @Override - public String getRule() { - return "Whenever a creature you control becomes the target of a spell, target opponent gets a poison counter."; - } -} diff --git a/Mage.Sets/src/mage/cards/w/WildDefiance.java b/Mage.Sets/src/mage/cards/w/WildDefiance.java index ee74a5bba37..902a70a70e6 100644 --- a/Mage.Sets/src/mage/cards/w/WildDefiance.java +++ b/Mage.Sets/src/mage/cards/w/WildDefiance.java @@ -1,24 +1,17 @@ package mage.cards.w; -import java.util.UUID; -import mage.MageObject; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; +import mage.abilities.common.BecomesTargetAnyTriggeredAbility; import mage.abilities.effects.common.continuous.BoostTargetEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.game.stack.Spell; -import mage.target.targetpointer.FixedTarget; +import mage.filter.StaticFilters; + +import java.util.UUID; /** - * @author noxx + * @author xenohedron */ public final class WildDefiance extends CardImpl { @@ -26,7 +19,8 @@ public final class WildDefiance extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}"); // Whenever a creature you control becomes the target of an instant or sorcery spell, that creature gets +3/+3 until end of turn. - this.addAbility(new CreaturesYouControlBecomesTargetTriggeredAbility(new BoostTargetEffect(3, 3, Duration.EndOfTurn))); + this.addAbility(new BecomesTargetAnyTriggeredAbility(new BoostTargetEffect(3, 3, Duration.EndOfTurn), + StaticFilters.FILTER_CONTROLLED_A_CREATURE, StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY)); } private WildDefiance(final WildDefiance card) { @@ -38,51 +32,3 @@ public final class WildDefiance extends CardImpl { return new WildDefiance(this); } } - -class CreaturesYouControlBecomesTargetTriggeredAbility extends TriggeredAbilityImpl { - - public CreaturesYouControlBecomesTargetTriggeredAbility(Effect effect) { - super(Zone.BATTLEFIELD, effect); - } - - private CreaturesYouControlBecomesTargetTriggeredAbility(final CreaturesYouControlBecomesTargetTriggeredAbility ability) { - super(ability); - } - - @Override - public CreaturesYouControlBecomesTargetTriggeredAbility copy() { - return new CreaturesYouControlBecomesTargetTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null - && permanent.isControlledBy(this.controllerId) - && permanent.isCreature(game)) { - MageObject object = game.getObject(event.getSourceId()); - if (object instanceof Spell) { - Card c = (Spell) object; - if (c.isInstantOrSorcery(game)) { - if (getTargets().isEmpty()) { - for (Effect effect : getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getTargetId(), game)); - } - } - return true; - } - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a creature you control becomes the target of an instant or sorcery spell, that creature gets +3/+3 until end of turn."; - } -} diff --git a/Mage/src/main/java/mage/abilities/common/BecomesTargetAnyTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BecomesTargetAnyTriggeredAbility.java new file mode 100644 index 00000000000..0a4917cf4f4 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/BecomesTargetAnyTriggeredAbility.java @@ -0,0 +1,97 @@ +package mage.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.SetTargetPointer; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.FilterStackObject; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.game.stack.StackObject; +import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; + +/** + * @author xenohedron + */ +public class BecomesTargetAnyTriggeredAbility extends TriggeredAbilityImpl { + + private final FilterPermanent filterTarget; + private final FilterStackObject filterStack; + private final SetTargetPointer setTargetPointer; + + public BecomesTargetAnyTriggeredAbility(Effect effect, FilterPermanent filterTarget) { + this(effect, filterTarget, StaticFilters.FILTER_SPELL_OR_ABILITY_A); + } + + /** + * "Whenever [a filterTarget] becomes the target of [a filterStack], [effect]" + * @param effect defaults to SetTargetPointer.PERMANENT + * @param filterTarget permanents to check being targetted + * @param filterStack spells/abilities to check targeting + */ + public BecomesTargetAnyTriggeredAbility(Effect effect, FilterPermanent filterTarget, FilterStackObject filterStack) { + this(effect, filterTarget, filterStack, SetTargetPointer.PERMANENT, false); + } + + public BecomesTargetAnyTriggeredAbility(Effect effect, FilterPermanent filterTarget, FilterStackObject filterStack, + SetTargetPointer setTargetPointer, boolean optional) { + super(Zone.BATTLEFIELD, effect, optional); + this.filterTarget = filterTarget; + this.filterStack = filterStack; + this.setTargetPointer = setTargetPointer; + setTriggerPhrase("Whenever " + filterTarget.getMessage() + " becomes the target of " + + filterStack.getMessage() + ", "); + } + + protected BecomesTargetAnyTriggeredAbility(final BecomesTargetAnyTriggeredAbility ability) { + super(ability); + this.filterTarget = ability.filterTarget; + this.filterStack = ability.filterStack; + this.setTargetPointer = ability.setTargetPointer; + } + + @Override + public BecomesTargetAnyTriggeredAbility copy() { + return new BecomesTargetAnyTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.TARGETED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent permanent = game.getPermanentOrLKIBattlefield(event.getTargetId()); + if (permanent == null || !filterTarget.match(permanent, getControllerId(), this, game)) { + return false; + } + StackObject targetingObject = CardUtil.getTargetingStackObject(event, game); + if (targetingObject == null || !filterStack.match(targetingObject, getControllerId(), this, game)) { + return false; + } + if (!CardUtil.checkTargetMap(this.id, targetingObject, event, game)) { + return false; + } + switch (setTargetPointer) { + case PERMANENT: + this.getAllEffects().setTargetPointer(new FixedTarget(permanent.getId(), game)); + break; + case PLAYER: + this.getAllEffects().setTargetPointer(new FixedTarget(targetingObject.getControllerId(), game)); + break; + case SPELL: + this.getAllEffects().setTargetPointer(new FixedTarget(targetingObject.getId())); + break; + case NONE: + break; + default: + throw new IllegalArgumentException("Unsupported SetTargetPointer in BecomesTargetAnyTriggeredAbility"); + } + return true; + } +} diff --git a/Mage/src/main/java/mage/abilities/common/BecomesTargetOpponentAllTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BecomesTargetOpponentAllTriggeredAbility.java deleted file mode 100644 index 598ee6ad0a3..00000000000 --- a/Mage/src/main/java/mage/abilities/common/BecomesTargetOpponentAllTriggeredAbility.java +++ /dev/null @@ -1,83 +0,0 @@ -package mage.abilities.common; - -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; -import mage.constants.Zone; -import mage.filter.FilterPermanent; -import mage.filter.StaticFilters; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.game.stack.StackObject; -import mage.players.Player; - -import java.util.*; - -/** - * @author weirddan455 - */ -public class BecomesTargetOpponentAllTriggeredAbility extends TriggeredAbilityImpl { - - private final FilterPermanent filter; - - public BecomesTargetOpponentAllTriggeredAbility(Effect effect, boolean optional) { - this(effect, StaticFilters.FILTER_CONTROLLED_A_PERMANENT, optional); - } - - public BecomesTargetOpponentAllTriggeredAbility(Effect effect, FilterPermanent filter, boolean optional) { - super(Zone.BATTLEFIELD, effect, optional); - this.filter = filter; - setTriggerPhrase("Whenever " + filter + " becomes the target of a spell or ability an opponent controls, "); - } - - private BecomesTargetOpponentAllTriggeredAbility(final BecomesTargetOpponentAllTriggeredAbility ability) { - super(ability); - this.filter = ability.filter; - } - - @Override - public BecomesTargetOpponentAllTriggeredAbility copy() { - return new BecomesTargetOpponentAllTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - StackObject sourceObject = game.getStack().getStackObject(event.getSourceId()); - if (sourceObject == null) { - return false; - } - Player targetter = game.getPlayer(event.getPlayerId()); - if (targetter == null || !targetter.hasOpponent(this.controllerId, game)) { - return false; - } - Permanent permanent = game.getPermanentOrLKIBattlefield(event.getTargetId()); - if (permanent == null || !filter.match(permanent, getControllerId(), this, game)) { - return false; - } - // If a spell or ability an opponent controls targets a single permanent you control more than once, - // Battle Mammoth’s triggered ability will trigger only once. - // However, if a spell or ability an opponent controls targets multiple permanents you control, - // Battle Mammoth’s triggered ability will trigger once for each of those permanents. - - // targetMap - key - targetId, value - Set of stackObject Ids - Map> targetMap = (Map>) game.getState().getValue("targetMap" + this.id); - if (targetMap == null) { - targetMap = new HashMap<>(); - } - Set sourceObjects = targetMap.get(event.getTargetId()); - if (sourceObjects == null) { - sourceObjects = new HashSet<>(); - } - if (!sourceObjects.add(sourceObject.getId())) { - return false; - } - targetMap.put(event.getTargetId(), sourceObjects); - game.getState().setValue("targetMap" + this.id, targetMap); - return true; - } -} diff --git a/Mage/src/main/java/mage/abilities/common/BecomesTargetTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BecomesTargetTriggeredAbility.java deleted file mode 100644 index cbd330ebb13..00000000000 --- a/Mage/src/main/java/mage/abilities/common/BecomesTargetTriggeredAbility.java +++ /dev/null @@ -1,73 +0,0 @@ -package mage.abilities.common; - -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; -import mage.constants.Zone; -import mage.filter.FilterPermanent; -import mage.filter.FilterStackObject; -import mage.filter.StaticFilters; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.game.stack.StackObject; -import mage.target.targetpointer.FixedTarget; - -/** - * @author Susucr - */ -public class BecomesTargetTriggeredAbility extends TriggeredAbilityImpl { - - private final FilterPermanent filterTarget; - private final FilterStackObject filterStack; - - public BecomesTargetTriggeredAbility(Effect effect, FilterPermanent filterTarget) { - this(effect, filterTarget, StaticFilters.FILTER_SPELL_OR_ABILITY_A); - } - - public BecomesTargetTriggeredAbility(Effect effect, FilterPermanent filterTarget, FilterStackObject filterStack) { - this(effect, filterTarget, filterStack, false); - } - - public BecomesTargetTriggeredAbility(Effect effect, FilterPermanent filterTarget, FilterStackObject filterStack, - boolean optional) { - super(Zone.BATTLEFIELD, effect, optional); - this.filterTarget = filterTarget; - this.filterStack = filterStack; - setTriggerPhrase("Whenever " + filterTarget.getMessage() + " becomes the target of " - + filterStack.getMessage() + ", "); - } - - protected BecomesTargetTriggeredAbility(final BecomesTargetTriggeredAbility ability) { - super(ability); - this.filterTarget = ability.filterTarget; - this.filterStack = ability.filterStack; - } - - @Override - public BecomesTargetTriggeredAbility copy() { - return new BecomesTargetTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - StackObject sourceObject = game.getStack().getStackObject(event.getSourceId()); - if (sourceObject == null - || !filterStack.match(sourceObject, getControllerId(), this, game)) { - return false; - } - Permanent permanent = game.getPermanentOrLKIBattlefield(event.getTargetId()); - if (permanent == null - || !filterTarget.match(permanent, getControllerId(), this, game)) { - return false; - } - - getEffects().setTargetPointer(new FixedTarget(event.getTargetId())); - - return true; - } -}