diff --git a/Mage.Sets/src/mage/cards/a/Aurification.java b/Mage.Sets/src/mage/cards/a/Aurification.java index 1d909171ae4..ce985e4a73b 100644 --- a/Mage.Sets/src/mage/cards/a/Aurification.java +++ b/Mage.Sets/src/mage/cards/a/Aurification.java @@ -37,7 +37,7 @@ public final class Aurification extends CardImpl { // Whenever a creature deals damage to you, put a gold counter on it. this.addAbility(new DealsDamageToYouAllTriggeredAbility(StaticFilters.FILTER_PERMANENT_CREATURE, - new AddCountersTargetEffect(CounterType.GOLD.createInstance()).setText("put a gold counter on it"))); + new AddCountersTargetEffect(CounterType.GOLD.createInstance()).setText("put a gold counter on it"), false)); // Each creature with a gold counter on it is a Wall in addition to its other creature types and has defender. BecomesSubtypeAllEffect becomesSubtypeAllEffect = new BecomesSubtypeAllEffect(Duration.WhileOnBattlefield, Arrays.asList(SubType.WALL), filter, false); diff --git a/Mage.Sets/src/mage/cards/c/ContestedWarZone.java b/Mage.Sets/src/mage/cards/c/ContestedWarZone.java index 44a14b7a5c7..27775924a28 100644 --- a/Mage.Sets/src/mage/cards/c/ContestedWarZone.java +++ b/Mage.Sets/src/mage/cards/c/ContestedWarZone.java @@ -1,22 +1,19 @@ package mage.cards.c; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.DealsDamageToYouAllTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.common.TargetPlayerGainControlSourceEffect; import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.StaticFilters; -import mage.game.Game; -import mage.game.events.DamagedPlayerEvent; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; + +import java.util.UUID; /** * @@ -28,7 +25,9 @@ public final class ContestedWarZone extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); // Whenever a creature deals combat damage to you, that creature's controller gains control of Contested War Zone. - this.addAbility(new ContestedWarZoneAbility()); + this.addAbility(new DealsDamageToYouAllTriggeredAbility(Zone.BATTLEFIELD, StaticFilters.FILTER_PERMANENT_CREATURE, + new TargetPlayerGainControlSourceEffect("that creature's controller"), + false, true, SetTargetPointer.PLAYER)); // {T}: Add {C}. this.addAbility(new ColorlessManaAbility()); @@ -49,72 +48,3 @@ public final class ContestedWarZone extends CardImpl { } } - -class ContestedWarZoneAbility extends TriggeredAbilityImpl { - - public ContestedWarZoneAbility() { - super(Zone.BATTLEFIELD, new ContestedWarZoneEffect()); - } - - private ContestedWarZoneAbility(final ContestedWarZoneAbility ability) { - super(ability); - } - - @Override - public ContestedWarZoneAbility copy() { - return new ContestedWarZoneAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; - if (damageEvent.isCombatDamage()) { - Permanent permanent = game.getPermanent(event.getSourceId()); - if (damageEvent.getPlayerId().equals(getControllerId()) && permanent != null && permanent.isCreature(game)) { - game.getState().setValue(getSourceId().toString(), permanent.getControllerId()); - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a creature deals combat damage to you, that creature's controller gains control of {this}."; - } - -} - -class ContestedWarZoneEffect extends ContinuousEffectImpl { - - ContestedWarZoneEffect() { - super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); - this.staticText = "Gain control of {this}"; - } - - private ContestedWarZoneEffect(final ContestedWarZoneEffect effect) { - super(effect); - } - - @Override - public ContestedWarZoneEffect copy() { - return new ContestedWarZoneEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - UUID controllerId = (UUID) game.getState().getValue(source.getSourceId().toString()); - if (permanent != null && controllerId != null) { - return permanent.changeControllerId(controllerId, game, source); - } else { - discard(); - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/d/DissipationField.java b/Mage.Sets/src/mage/cards/d/DissipationField.java index 459a1ff875e..8bc36d10325 100644 --- a/Mage.Sets/src/mage/cards/d/DissipationField.java +++ b/Mage.Sets/src/mage/cards/d/DissipationField.java @@ -20,7 +20,7 @@ public final class DissipationField extends CardImpl { // Whenever a permanent deals damage to you, return it to its owner's hand. this.addAbility(new DealsDamageToYouAllTriggeredAbility(StaticFilters.FILTER_PERMANENT, - new ReturnToHandTargetEffect().setText("return it to its owner's hand"))); + new ReturnToHandTargetEffect().setText("return it to its owner's hand"), false)); } private DissipationField(final DissipationField card) { diff --git a/Mage.Sets/src/mage/cards/d/Dread.java b/Mage.Sets/src/mage/cards/d/Dread.java index 32f114f04e9..09e71150bd8 100644 --- a/Mage.Sets/src/mage/cards/d/Dread.java +++ b/Mage.Sets/src/mage/cards/d/Dread.java @@ -33,7 +33,7 @@ public final class Dread extends CardImpl { // Whenever a creature deals damage to you, destroy it. this.addAbility(new DealsDamageToYouAllTriggeredAbility(StaticFilters.FILTER_PERMANENT_CREATURE, - new DestroyTargetEffect().setText("destroy it"))); + new DestroyTargetEffect().setText("destroy it"), false)); // When Dread is put into a graveyard from anywhere, shuffle it into its owner's library. this.addAbility(new PutIntoGraveFromAnywhereSourceTriggeredAbility(new ShuffleIntoLibrarySourceEffect())); diff --git a/Mage.Sets/src/mage/cards/h/HixusPrisonWarden.java b/Mage.Sets/src/mage/cards/h/HixusPrisonWarden.java index 706e891da13..9118193e599 100644 --- a/Mage.Sets/src/mage/cards/h/HixusPrisonWarden.java +++ b/Mage.Sets/src/mage/cards/h/HixusPrisonWarden.java @@ -1,9 +1,9 @@ package mage.cards.h; -import java.util.UUID; import mage.MageInt; -import mage.MageObject; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.DealsDamageToYouAllTriggeredAbility; +import mage.abilities.condition.common.SourceEnteredThisTurnCondition; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.ExileUntilSourceLeavesEffect; import mage.abilities.keyword.FlashAbility; import mage.cards.CardImpl; @@ -11,12 +11,9 @@ 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.DamagedPlayerEvent; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.target.targetpointer.FixedTarget; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -36,7 +33,11 @@ public final class HixusPrisonWarden extends CardImpl { this.addAbility(FlashAbility.getInstance()); // Whenever a creature deals combat damage to you, if Hixus, Prison Warden entered the battlefield this turn, exile that creature until Hixus leaves the battlefield. - this.addAbility(new HixusPrisonWardenTriggeredAbility()); + this.addAbility(new ConditionalInterveningIfTriggeredAbility(new DealsDamageToYouAllTriggeredAbility( + StaticFilters.FILTER_PERMANENT_CREATURE, new ExileUntilSourceLeavesEffect(), true + ).setTriggerPhrase("Whenever a creature deals combat damage to you, if {this} entered the battlefield this turn, "), + SourceEnteredThisTurnCondition.instance, null + )); } private HixusPrisonWarden(final HixusPrisonWarden card) { @@ -48,45 +49,3 @@ public final class HixusPrisonWarden extends CardImpl { return new HixusPrisonWarden(this); } } - -class HixusPrisonWardenTriggeredAbility extends TriggeredAbilityImpl { - - public HixusPrisonWardenTriggeredAbility() { - super(Zone.BATTLEFIELD, new ExileUntilSourceLeavesEffect()); - setTriggerPhrase("Whenever a creature deals combat damage to you, if {this} entered the battlefield this turn, "); - } - - private HixusPrisonWardenTriggeredAbility(final HixusPrisonWardenTriggeredAbility ability) { - super(ability); - } - - @Override - public HixusPrisonWardenTriggeredAbility copy() { - return new HixusPrisonWardenTriggeredAbility(this); - } - - @Override - public boolean checkInterveningIfClause(Game game) { - MageObject mageObject = getSourceObject(game); - return (mageObject instanceof Permanent) && ((Permanent) mageObject).getTurnsOnBattlefield() == 0; - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; - Permanent sourcePermanent = game.getPermanent(event.getSourceId()); - if (damageEvent.getPlayerId().equals(getControllerId()) - && damageEvent.isCombatDamage() - && sourcePermanent != null - && sourcePermanent.isCreature(game)) { - getEffects().get(0).setTargetPointer(new FixedTarget(event.getSourceId(), game)); - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/m/MikaeusTheUnhallowed.java b/Mage.Sets/src/mage/cards/m/MikaeusTheUnhallowed.java index be5274b8048..529f62d70c5 100644 --- a/Mage.Sets/src/mage/cards/m/MikaeusTheUnhallowed.java +++ b/Mage.Sets/src/mage/cards/m/MikaeusTheUnhallowed.java @@ -44,7 +44,7 @@ public final class MikaeusTheUnhallowed extends CardImpl { // Whenever a Human deals damage to you, destroy it. this.addAbility(new DealsDamageToYouAllTriggeredAbility(filterHuman, - new DestroyTargetEffect().setText("destroy it"))); + new DestroyTargetEffect().setText("destroy it"), false)); // Other non-Human creatures you control get +1/+1 and have undying. Ability ability = new SimpleStaticAbility(new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filter, true)); diff --git a/Mage.Sets/src/mage/cards/n/NoMercy.java b/Mage.Sets/src/mage/cards/n/NoMercy.java index 76dccf99e90..b5b6c470cdb 100644 --- a/Mage.Sets/src/mage/cards/n/NoMercy.java +++ b/Mage.Sets/src/mage/cards/n/NoMercy.java @@ -20,7 +20,7 @@ public final class NoMercy extends CardImpl { // Whenever a creature deals damage to you, destroy it. this.addAbility(new DealsDamageToYouAllTriggeredAbility(StaticFilters.FILTER_PERMANENT_CREATURE, - new DestroyTargetEffect().setText("destroy it"))); + new DestroyTargetEffect().setText("destroy it"), false)); } private NoMercy(final NoMercy card) { diff --git a/Mage.Sets/src/mage/cards/s/StrixhavenStadium.java b/Mage.Sets/src/mage/cards/s/StrixhavenStadium.java index d44a036fd08..467728d4681 100644 --- a/Mage.Sets/src/mage/cards/s/StrixhavenStadium.java +++ b/Mage.Sets/src/mage/cards/s/StrixhavenStadium.java @@ -1,8 +1,8 @@ package mage.cards.s; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.DealsDamageToAPlayerAllTriggeredAbility; +import mage.abilities.common.DealsDamageToYouAllTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; @@ -13,8 +13,6 @@ import mage.constants.*; import mage.counters.CounterType; import mage.filter.StaticFilters; import mage.game.Game; -import mage.game.events.DamagedPlayerEvent; -import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; @@ -34,7 +32,8 @@ public final class StrixhavenStadium extends CardImpl { this.addAbility(ability); // Whenever a creature deals combat damage to you, remove a point counter from Strixhaven Stadium. - this.addAbility(new StrixhavenStadiumTriggeredAbility()); + this.addAbility(new DealsDamageToYouAllTriggeredAbility(StaticFilters.FILTER_PERMANENT_CREATURE, + new RemoveCounterSourceEffect(CounterType.POINT.createInstance()), true)); // Whenever a creature you control deals combat damage to an opponent, put a point counter on Strixhaven Stadium. Then if it has ten or more point counters on it, remove them all and that player loses the game. ability = new DealsDamageToAPlayerAllTriggeredAbility( @@ -56,42 +55,6 @@ public final class StrixhavenStadium extends CardImpl { } } -class StrixhavenStadiumTriggeredAbility extends TriggeredAbilityImpl { - - StrixhavenStadiumTriggeredAbility() { - super(Zone.BATTLEFIELD, new RemoveCounterSourceEffect(CounterType.POINT.createInstance())); - } - - private StrixhavenStadiumTriggeredAbility(final StrixhavenStadiumTriggeredAbility ability) { - super(ability); - } - - @Override - public StrixhavenStadiumTriggeredAbility copy() { - return new StrixhavenStadiumTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; - Permanent sourcePermanent = game.getPermanent(event.getSourceId()); - return isControlledBy(damageEvent.getTargetId()) - && damageEvent.isCombatDamage() - && sourcePermanent != null - && sourcePermanent.isCreature(game); - } - - @Override - public String getRule() { - return "Whenever a creature deals combat damage to you, remove a point counter from {this}."; - } -} - class StrixhavenStadiumEffect extends OneShotEffect { StrixhavenStadiumEffect() { diff --git a/Mage.Sets/src/mage/cards/t/TeysaEnvoyOfGhosts.java b/Mage.Sets/src/mage/cards/t/TeysaEnvoyOfGhosts.java index c0d996b3293..94ca5443a8e 100644 --- a/Mage.Sets/src/mage/cards/t/TeysaEnvoyOfGhosts.java +++ b/Mage.Sets/src/mage/cards/t/TeysaEnvoyOfGhosts.java @@ -1,7 +1,8 @@ package mage.cards.t; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.Ability; +import mage.abilities.common.DealsDamageToYouAllTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.keyword.ProtectionAbility; @@ -11,17 +12,11 @@ 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.DamagedPlayerEvent; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreatureCard; import mage.game.permanent.token.WhiteBlackSpiritToken; -import mage.target.targetpointer.FixedTarget; import java.util.UUID; -import mage.filter.common.FilterCreatureCard; - /** * @author LevelX2 @@ -44,7 +39,10 @@ public final class TeysaEnvoyOfGhosts extends CardImpl { this.addAbility(new ProtectionAbility(new FilterCreatureCard("creatures"))); // Whenever a creature deals combat damage to you, destroy that creature. Create a 1/1 white and black Spirit creature token with flying. - this.addAbility(new TeysaEnvoyOfGhostsTriggeredAbility()); + Ability ability = new DealsDamageToYouAllTriggeredAbility(StaticFilters.FILTER_PERMANENT_CREATURE, + new DestroyTargetEffect(), true); + ability.addEffect(new CreateTokenEffect(new WhiteBlackSpiritToken(), 1)); + this.addAbility(ability); } @@ -57,46 +55,3 @@ public final class TeysaEnvoyOfGhosts extends CardImpl { return new TeysaEnvoyOfGhosts(this); } } - -class TeysaEnvoyOfGhostsTriggeredAbility extends TriggeredAbilityImpl { - - public TeysaEnvoyOfGhostsTriggeredAbility() { - super(Zone.BATTLEFIELD, new DestroyTargetEffect()); - this.addEffect(new CreateTokenEffect(new WhiteBlackSpiritToken(), 1)); - } - - private TeysaEnvoyOfGhostsTriggeredAbility(final TeysaEnvoyOfGhostsTriggeredAbility ability) { - super(ability); - } - - @Override - public TeysaEnvoyOfGhostsTriggeredAbility copy() { - return new TeysaEnvoyOfGhostsTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; - Permanent sourcePermanent = game.getPermanent(event.getSourceId()); - if (damageEvent.getPlayerId().equals(getControllerId()) - && damageEvent.isCombatDamage() - && sourcePermanent != null - && sourcePermanent.isCreature(game)) { - game.getState().setValue(sourceId.toString(), sourcePermanent.getControllerId()); - getEffects().get(0).setTargetPointer(new FixedTarget(event.getSourceId())); - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever a creature deals combat damage to you, destroy that creature. Create a 1/1 white and black Spirit creature token with flying."; - } - -} diff --git a/Mage/src/main/java/mage/abilities/common/DealsDamageToYouAllTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DealsDamageToYouAllTriggeredAbility.java index d49d0b11255..6f53ed2cabc 100644 --- a/Mage/src/main/java/mage/abilities/common/DealsDamageToYouAllTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/DealsDamageToYouAllTriggeredAbility.java @@ -2,6 +2,7 @@ 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.game.Game; @@ -18,15 +19,18 @@ public class DealsDamageToYouAllTriggeredAbility extends TriggeredAbilityImpl { private final FilterPermanent filter; private final boolean onlyCombat; + private final SetTargetPointer setTargetPointer; - public DealsDamageToYouAllTriggeredAbility(FilterPermanent filter, Effect effect) { - this(Zone.BATTLEFIELD, filter, effect, false, false); + public DealsDamageToYouAllTriggeredAbility(FilterPermanent filter, Effect effect, boolean onlyCombat) { + this(Zone.BATTLEFIELD, filter, effect, false, onlyCombat, SetTargetPointer.PERMANENT); } - public DealsDamageToYouAllTriggeredAbility(Zone zone, FilterPermanent filter, Effect effect, boolean optional, boolean onlyCombat) { + public DealsDamageToYouAllTriggeredAbility(Zone zone, FilterPermanent filter, Effect effect, + boolean optional, boolean onlyCombat, SetTargetPointer setTargetPointer) { super(zone, effect, optional); this.filter = filter; this.onlyCombat = onlyCombat; + this.setTargetPointer = setTargetPointer; setTriggerPhrase("Whenever " + CardUtil.addArticle(filter.getMessage()) + " deals " + (onlyCombat ? "combat " : "") + "damage to you, "); } @@ -34,6 +38,7 @@ public class DealsDamageToYouAllTriggeredAbility extends TriggeredAbilityImpl { super(ability); this.filter = ability.filter; this.onlyCombat = ability.onlyCombat; + this.setTargetPointer = ability.setTargetPointer; } @Override @@ -59,7 +64,18 @@ public class DealsDamageToYouAllTriggeredAbility extends TriggeredAbilityImpl { return false; } this.getEffects().setValue("damage", event.getAmount()); - this.getEffects().setTargetPointer(new FixedTarget(permanent, game)); + switch (setTargetPointer) { + case NONE: + break; + case PERMANENT: + this.getEffects().setTargetPointer(new FixedTarget(permanent, game)); + break; + case PLAYER: + this.getEffects().setTargetPointer(new FixedTarget(permanent.getControllerId())); + break; + default: + throw new UnsupportedOperationException("SetTargetPointer not handled in DealsDamageToYouAllTriggeredAbility " + setTargetPointer); + } return true; } }