From 784a0f564b85d037146a6d137b8aa99a4fe16f0c Mon Sep 17 00:00:00 2001 From: xenohedron Date: Sat, 6 Jan 2024 14:57:56 -0500 Subject: [PATCH] fix #11606 (PreventDamageToSourceEffect zcc check) --- .../prevention/PreventDamageToSourceTest.java | 58 +++++++++++++++++++ .../common/PreventDamageToSourceEffect.java | 3 + 2 files changed, 61 insertions(+) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/prevention/PreventDamageToSourceTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/prevention/PreventDamageToSourceTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/prevention/PreventDamageToSourceTest.java new file mode 100644 index 00000000000..dab9199ca5a --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/prevention/PreventDamageToSourceTest.java @@ -0,0 +1,58 @@ +package org.mage.test.cards.prevention; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author xenohedron + */ +public class PreventDamageToSourceTest extends CardTestPlayerBase { + + private static final String elder = "Revered Elder"; // 1/2 + private static final String preventAbility = "{1}: Prevent the next 1 damage that would be dealt to "; + private static final String shock = "Shock"; // R 2 damage to any target + private static final String ds = "Desert Sandstorm"; // 2R 1 damage to each creature + private static final String cloudshift = "Cloudshift"; // W flicker + + @Test + public void test1DamagePrevented() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); + addCard(Zone.BATTLEFIELD, playerA, elder); + addCard(Zone.HAND, playerA, shock); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, preventAbility); + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, shock, elder); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertGraveyardCount(playerA, shock, 1); + assertDamageReceived(playerA, elder, 1); // 1 damage prevented + } + + @Test + public void testFlickerDoesntPrevent() { + addCard(Zone.BATTLEFIELD, playerA, "Plateau", 5); + addCard(Zone.BATTLEFIELD, playerA, elder); + addCard(Zone.HAND, playerA, ds); + addCard(Zone.HAND, playerA, cloudshift); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, ds); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, preventAbility); + waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, 1); + // resolve prevent ability, desert sandstorm still on stack + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, cloudshift, elder); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, ds, 1); + assertGraveyardCount(playerA, cloudshift, 1); + assertDamageReceived(playerA, elder, 1); // damage not prevented + } + +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/PreventDamageToSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PreventDamageToSourceEffect.java index a8cf5d64add..748b792809f 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PreventDamageToSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PreventDamageToSourceEffect.java @@ -39,6 +39,9 @@ public class PreventDamageToSourceEffect extends PreventionEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { + if (source.getSourcePermanentIfItStillExists(game) == null) { + return false; + } return super.applies(event, source, game) && event.getTargetId().equals(source.getSourceId()); }