new common BecomesTargetAnyTriggeredAbility

This commit is contained in:
xenohedron 2023-09-21 00:19:12 -04:00
parent 65523b9fec
commit 6abe9ff821
20 changed files with 257 additions and 876 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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 Mammoths triggered ability will trigger only once.
// However, if a spell or ability an opponent controls targets multiple permanents you control,
// Battle Mammoths triggered ability will trigger once for each of those permanents.
// targetMap - key - targetId, value - Set of stackObject Ids
Map<UUID, Set<UUID>> targetMap = (Map<UUID, Set<UUID>>) game.getState().getValue("targetMap" + this.id);
if (targetMap == null) {
targetMap = new HashMap<>();
}
Set<UUID> 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;
}
}

View file

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