From 86fe23e396302a7b76641f14e8cd6515a5deb43b Mon Sep 17 00:00:00 2001 From: theelk801 Date: Thu, 10 Apr 2025 19:07:34 -0400 Subject: [PATCH] [TDM] Implement New Way Forward --- .../src/mage/cards/d/DeflectingPalm.java | 41 +++----- Mage.Sets/src/mage/cards/n/NewWayForward.java | 97 +++++++++++++++++++ .../src/mage/sets/TarkirDragonstorm.java | 1 + 3 files changed, 114 insertions(+), 25 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/n/NewWayForward.java diff --git a/Mage.Sets/src/mage/cards/d/DeflectingPalm.java b/Mage.Sets/src/mage/cards/d/DeflectingPalm.java index 7189cbe5329..a9f8bdccb89 100644 --- a/Mage.Sets/src/mage/cards/d/DeflectingPalm.java +++ b/Mage.Sets/src/mage/cards/d/DeflectingPalm.java @@ -1,6 +1,5 @@ package mage.cards.d; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.PreventionEffectData; import mage.abilities.effects.PreventionEffectImpl; @@ -11,8 +10,6 @@ import mage.constants.Duration; import mage.constants.Outcome; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.game.stack.Spell; import mage.players.Player; import mage.target.TargetSource; @@ -44,9 +41,11 @@ class DeflectingPalmEffect extends PreventionEffectImpl { private final TargetSource target; - public DeflectingPalmEffect() { + DeflectingPalmEffect() { super(Duration.EndOfTurn, Integer.MAX_VALUE, false, false); - this.staticText = "The next time a source of your choice would deal damage to you this turn, prevent that damage. If damage is prevented this way, {this} deals that much damage to that source's controller"; + this.staticText = "the next time a source of your choice would deal damage to you this turn, " + + "prevent that damage. If damage is prevented this way, " + + "{this} deals that much damage to that source's controller"; this.target = new TargetSource(); } @@ -71,31 +70,23 @@ class DeflectingPalmEffect extends PreventionEffectImpl { PreventionEffectData preventionData = preventDamageAction(event, source, game); this.used = true; this.discard(); // only one use - if (preventionData.getPreventedDamage() > 0) { - MageObject damageDealingObject = game.getObject(target.getFirstTarget()); - UUID objectControllerId = null; - if (damageDealingObject instanceof Permanent) { - objectControllerId = ((Permanent) damageDealingObject).getControllerId(); - } else if (damageDealingObject instanceof Ability) { - objectControllerId = ((Ability) damageDealingObject).getControllerId(); - } else if (damageDealingObject instanceof Spell) { - objectControllerId = ((Spell) damageDealingObject).getControllerId(); - } - if (objectControllerId != null) { - Player objectController = game.getPlayer(objectControllerId); - if (objectController != null) { - objectController.damage(preventionData.getPreventedDamage(), source.getSourceId(), source, game); - } - } + if (preventionData.getPreventedDamage() < 1) { + return true; } + UUID objectControllerId = game.getControllerId(target.getFirstTarget()); + Player objectController = game.getPlayer(objectControllerId); + if (objectController == null) { + return true; + } + objectController.damage(preventionData.getPreventedDamage(), source.getSourceId(), source, game); return true; } @Override public boolean applies(GameEvent event, Ability source, Game game) { - if (!this.used && super.applies(event, source, game)) { - return event.getTargetId().equals(source.getControllerId()) && event.getSourceId().equals(target.getFirstTarget()); - } - return false; + return !this.used + && super.applies(event, source, game) + && event.getTargetId().equals(source.getControllerId()) + && event.getSourceId().equals(target.getFirstTarget()); } } diff --git a/Mage.Sets/src/mage/cards/n/NewWayForward.java b/Mage.Sets/src/mage/cards/n/NewWayForward.java new file mode 100644 index 00000000000..7b359e2b9ea --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NewWayForward.java @@ -0,0 +1,97 @@ +package mage.cards.n; + +import mage.abilities.Ability; +import mage.abilities.common.delayed.ReflexiveTriggeredAbility; +import mage.abilities.effects.PreventionEffectData; +import mage.abilities.effects.PreventionEffectImpl; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.target.TargetSource; +import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class NewWayForward extends CardImpl { + + public NewWayForward(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}{R}{W}"); + + // The next time a source of your choice would deal damage to you this turn, prevent that damage. When damage is prevented this way, New Way Forward deals that much damage to that source's controller and you draw that many cards. + this.getSpellAbility().addEffect(new NewWayForwardEffect()); + } + + private NewWayForward(final NewWayForward card) { + super(card); + } + + @Override + public NewWayForward copy() { + return new NewWayForward(this); + } +} + +class NewWayForwardEffect extends PreventionEffectImpl { + + private final TargetSource target; + + NewWayForwardEffect() { + super(Duration.EndOfTurn, Integer.MAX_VALUE, false, false); + this.staticText = "the next time a source of your choice would deal damage to you this turn, " + + "prevent that damage. When damage is prevented this way, " + + "{this} deals that much damage to that source's controller and you draw that many cards"; + this.target = new TargetSource(); + } + + private NewWayForwardEffect(final NewWayForwardEffect effect) { + super(effect); + this.target = effect.target.copy(); + } + + @Override + public NewWayForwardEffect copy() { + return new NewWayForwardEffect(this); + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + this.target.choose(Outcome.PreventDamage, source.getControllerId(), source.getSourceId(), source, game); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + PreventionEffectData preventionData = preventDamageAction(event, source, game); + this.used = true; + this.discard(); // only one use + if (preventionData.getPreventedDamage() < 1) { + return true; + } + UUID objectControllerId = game.getControllerId(target.getFirstTarget()); + ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility( + new DamageTargetEffect(preventionData.getPreventedDamage()) + .setTargetPointer(new FixedTarget(objectControllerId)), + false + ); + ability.addEffect(new DrawCardSourceControllerEffect(preventionData.getPreventedDamage())); + game.fireReflexiveTriggeredAbility(ability, source); + return true; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return !this.used + && super.applies(event, source, game) + && event.getTargetId().equals(source.getControllerId()) + && event.getSourceId().equals(target.getFirstTarget()); + } +} diff --git a/Mage.Sets/src/mage/sets/TarkirDragonstorm.java b/Mage.Sets/src/mage/sets/TarkirDragonstorm.java index 41fc545735f..2c7e22fd57c 100644 --- a/Mage.Sets/src/mage/sets/TarkirDragonstorm.java +++ b/Mage.Sets/src/mage/sets/TarkirDragonstorm.java @@ -176,6 +176,7 @@ public final class TarkirDragonstorm extends ExpansionSet { cards.add(new SetCardInfo("Narset, Jeskai Waymaster", 209, Rarity.RARE, mage.cards.n.NarsetJeskaiWaymaster.class)); cards.add(new SetCardInfo("Nature's Rhythm", 150, Rarity.RARE, mage.cards.n.NaturesRhythm.class)); cards.add(new SetCardInfo("Neriv, Heart of the Storm", 210, Rarity.MYTHIC, mage.cards.n.NerivHeartOfTheStorm.class)); + cards.add(new SetCardInfo("New Way Forward", 211, Rarity.RARE, mage.cards.n.NewWayForward.class)); cards.add(new SetCardInfo("Nightblade Brigade", 85, Rarity.COMMON, mage.cards.n.NightbladeBrigade.class)); cards.add(new SetCardInfo("Nomad Outpost", 263, Rarity.UNCOMMON, mage.cards.n.NomadOutpost.class)); cards.add(new SetCardInfo("Opulent Palace", 264, Rarity.UNCOMMON, mage.cards.o.OpulentPalace.class));