From 21f1aa559b90e50f949f223bfa1ec8d5603e9171 Mon Sep 17 00:00:00 2001 From: xenohedron Date: Sun, 2 Jun 2024 03:12:42 -0400 Subject: [PATCH] common class for "whenever ... deals damage to you, " --- .../src/mage/cards/d/DissipationField.java | 54 ++------------- Mage.Sets/src/mage/cards/d/Dread.java | 53 ++------------- .../mage/cards/m/MikaeusTheUnhallowed.java | 51 ++------------- Mage.Sets/src/mage/cards/n/NoMercy.java | 53 ++------------- .../DealsDamageToYouAllTriggeredAbility.java | 65 +++++++++++++++++++ 5 files changed, 89 insertions(+), 187 deletions(-) create mode 100644 Mage/src/main/java/mage/abilities/common/DealsDamageToYouAllTriggeredAbility.java diff --git a/Mage.Sets/src/mage/cards/d/DissipationField.java b/Mage.Sets/src/mage/cards/d/DissipationField.java index 5725012fcb3..459a1ff875e 100644 --- a/Mage.Sets/src/mage/cards/d/DissipationField.java +++ b/Mage.Sets/src/mage/cards/d/DissipationField.java @@ -1,18 +1,13 @@ - package mage.cards.d; -import java.util.UUID; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.DealsDamageToYouAllTriggeredAbility; 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.target.targetpointer.FixedTarget; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -24,7 +19,8 @@ public final class DissipationField extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{U}"); // Whenever a permanent deals damage to you, return it to its owner's hand. - this.addAbility(new DissipationFieldAbility()); + this.addAbility(new DealsDamageToYouAllTriggeredAbility(StaticFilters.FILTER_PERMANENT, + new ReturnToHandTargetEffect().setText("return it to its owner's hand"))); } private DissipationField(final DissipationField card) { @@ -36,41 +32,3 @@ public final class DissipationField extends CardImpl { return new DissipationField(this); } } - -class DissipationFieldAbility extends TriggeredAbilityImpl { - - public DissipationFieldAbility() { - super(Zone.BATTLEFIELD, new ReturnToHandTargetEffect()); - } - - private DissipationFieldAbility(final DissipationFieldAbility effect) { - super(effect); - } - - @Override - public DissipationFieldAbility copy() { - return new DissipationFieldAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getTargetId().equals(this.controllerId)) { - Permanent permanent = game.getPermanent(event.getSourceId()); - if (permanent != null) { - this.getEffects().get(0).setTargetPointer(new FixedTarget(permanent, game)); - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a permanent deals damage to you, return it to its owner's hand."; - } -} diff --git a/Mage.Sets/src/mage/cards/d/Dread.java b/Mage.Sets/src/mage/cards/d/Dread.java index aca56ed9898..32f114f04e9 100644 --- a/Mage.Sets/src/mage/cards/d/Dread.java +++ b/Mage.Sets/src/mage/cards/d/Dread.java @@ -1,9 +1,7 @@ - package mage.cards.d; -import java.util.UUID; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.DealsDamageToYouAllTriggeredAbility; import mage.abilities.common.PutIntoGraveFromAnywhereSourceTriggeredAbility; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.ShuffleIntoLibrarySourceEffect; @@ -12,11 +10,9 @@ 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.target.targetpointer.FixedTarget; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -36,7 +32,8 @@ public final class Dread extends CardImpl { this.addAbility(FearAbility.getInstance()); // Whenever a creature deals damage to you, destroy it. - this.addAbility(new DreadTriggeredAbility()); + this.addAbility(new DealsDamageToYouAllTriggeredAbility(StaticFilters.FILTER_PERMANENT_CREATURE, + new DestroyTargetEffect().setText("destroy it"))); // When Dread is put into a graveyard from anywhere, shuffle it into its owner's library. this.addAbility(new PutIntoGraveFromAnywhereSourceTriggeredAbility(new ShuffleIntoLibrarySourceEffect())); @@ -51,41 +48,3 @@ public final class Dread extends CardImpl { return new Dread(this); } } - -class DreadTriggeredAbility extends TriggeredAbilityImpl { - - DreadTriggeredAbility() { - super(Zone.BATTLEFIELD, new DestroyTargetEffect(), false); - } - - private DreadTriggeredAbility(final DreadTriggeredAbility ability) { - super(ability); - } - - @Override - public DreadTriggeredAbility copy() { - return new DreadTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getPlayerId().equals(this.getControllerId())) { - Permanent permanent = game.getPermanent(event.getSourceId()); - if (permanent != null && permanent.isCreature(game)) { - this.getEffects().setTargetPointer(new FixedTarget(permanent, game)); - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a creature deals damage to you, destroy it."; - } -} diff --git a/Mage.Sets/src/mage/cards/m/MikaeusTheUnhallowed.java b/Mage.Sets/src/mage/cards/m/MikaeusTheUnhallowed.java index 299e51a933f..be5274b8048 100644 --- a/Mage.Sets/src/mage/cards/m/MikaeusTheUnhallowed.java +++ b/Mage.Sets/src/mage/cards/m/MikaeusTheUnhallowed.java @@ -1,9 +1,8 @@ - package mage.cards.m; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.DealsDamageToYouAllTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; @@ -13,12 +12,9 @@ import mage.abilities.keyword.UndyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; +import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.target.targetpointer.FixedTarget; import java.util.UUID; @@ -29,6 +25,7 @@ import java.util.UUID; public final class MikaeusTheUnhallowed extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("non-Human creatures"); + private static final FilterPermanent filterHuman = new FilterPermanent(SubType.HUMAN, "Human"); static { filter.add(Predicates.not(SubType.HUMAN.getPredicate())); @@ -44,8 +41,10 @@ public final class MikaeusTheUnhallowed extends CardImpl { this.toughness = new MageInt(5); this.addAbility(IntimidateAbility.getInstance()); + // Whenever a Human deals damage to you, destroy it. - this.addAbility(new MikaeusTheUnhallowedAbility()); + this.addAbility(new DealsDamageToYouAllTriggeredAbility(filterHuman, + new DestroyTargetEffect().setText("destroy it"))); // Other non-Human creatures you control get +1/+1 and have undying. Ability ability = new SimpleStaticAbility(new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filter, true)); @@ -64,41 +63,3 @@ public final class MikaeusTheUnhallowed extends CardImpl { return new MikaeusTheUnhallowed(this); } } - -class MikaeusTheUnhallowedAbility extends TriggeredAbilityImpl { - - public MikaeusTheUnhallowedAbility() { - super(Zone.BATTLEFIELD, new DestroyTargetEffect()); - } - - private MikaeusTheUnhallowedAbility(final MikaeusTheUnhallowedAbility ability) { - super(ability); - } - - @Override - public MikaeusTheUnhallowedAbility copy() { - return new MikaeusTheUnhallowedAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getTargetId().equals(this.controllerId)) { - Permanent permanent = game.getPermanent(event.getSourceId()); - if (permanent != null && permanent.hasSubtype(SubType.HUMAN, game)) { - this.getEffects().get(0).setTargetPointer(new FixedTarget(permanent, game)); - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a Human deals damage to you, destroy it."; - } -} diff --git a/Mage.Sets/src/mage/cards/n/NoMercy.java b/Mage.Sets/src/mage/cards/n/NoMercy.java index 8bf1494e14a..76dccf99e90 100644 --- a/Mage.Sets/src/mage/cards/n/NoMercy.java +++ b/Mage.Sets/src/mage/cards/n/NoMercy.java @@ -1,17 +1,13 @@ - package mage.cards.n; -import java.util.UUID; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.DealsDamageToYouAllTriggeredAbility; import mage.abilities.effects.common.DestroyTargetEffect; 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; /** * @@ -23,7 +19,8 @@ public final class NoMercy extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}{B}"); // Whenever a creature deals damage to you, destroy it. - this.addAbility(new NoMercyTriggeredAbility()); + this.addAbility(new DealsDamageToYouAllTriggeredAbility(StaticFilters.FILTER_PERMANENT_CREATURE, + new DestroyTargetEffect().setText("destroy it"))); } private NoMercy(final NoMercy card) { @@ -35,42 +32,4 @@ public final class NoMercy extends CardImpl { return new NoMercy(this); } - public static class NoMercyTriggeredAbility extends TriggeredAbilityImpl { - - public NoMercyTriggeredAbility() { - super(Zone.BATTLEFIELD, new DestroyTargetEffect()); - } - - private NoMercyTriggeredAbility(final NoMercyTriggeredAbility ability) { - super(ability); - } - - @Override - public NoMercyTriggeredAbility copy() { - return new NoMercyTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getPlayerId().equals(this.getControllerId())) { - Permanent permanent = game.getPermanent(event.getSourceId()); - if (permanent != null && permanent.isCreature(game)) { - this.getEffects().setTargetPointer(new FixedTarget(permanent, game)); - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a creature deals damage to you, destroy it."; - } - - } } diff --git a/Mage/src/main/java/mage/abilities/common/DealsDamageToYouAllTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DealsDamageToYouAllTriggeredAbility.java new file mode 100644 index 00000000000..d49d0b11255 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/DealsDamageToYouAllTriggeredAbility.java @@ -0,0 +1,65 @@ +package mage.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +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.util.CardUtil; + +/** + * @author xenohedron + */ +public class DealsDamageToYouAllTriggeredAbility extends TriggeredAbilityImpl { + + private final FilterPermanent filter; + private final boolean onlyCombat; + + public DealsDamageToYouAllTriggeredAbility(FilterPermanent filter, Effect effect) { + this(Zone.BATTLEFIELD, filter, effect, false, false); + } + + public DealsDamageToYouAllTriggeredAbility(Zone zone, FilterPermanent filter, Effect effect, boolean optional, boolean onlyCombat) { + super(zone, effect, optional); + this.filter = filter; + this.onlyCombat = onlyCombat; + setTriggerPhrase("Whenever " + CardUtil.addArticle(filter.getMessage()) + " deals " + (onlyCombat ? "combat " : "") + "damage to you, "); + } + + protected DealsDamageToYouAllTriggeredAbility(final DealsDamageToYouAllTriggeredAbility ability) { + super(ability); + this.filter = ability.filter; + this.onlyCombat = ability.onlyCombat; + } + + @Override + public DealsDamageToYouAllTriggeredAbility copy() { + return new DealsDamageToYouAllTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (onlyCombat && !((DamagedPlayerEvent) event).isCombatDamage()) { + return false; + } + if (event.getTargetId() != getControllerId()) { + return false; + } + Permanent permanent = game.getPermanent(event.getSourceId()); + if (!filter.match(permanent, getControllerId(), this, game)) { + return false; + } + this.getEffects().setValue("damage", event.getAmount()); + this.getEffects().setTargetPointer(new FixedTarget(permanent, game)); + return true; + } +}