diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/AfflictTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/AfflictTest.java index 05296b70f8d..ae8ec571197 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/AfflictTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/AfflictTest.java @@ -7,14 +7,14 @@ import org.mage.test.serverside.base.CardTestPlayerBase; public class AfflictTest extends CardTestPlayerBase { - private String khenra = "Khenra Eternal"; - private String elves = "Llanowar Elves"; + private final String khenra = "Khenra Eternal"; + private final String elves = "Llanowar Elves"; @Test - public void testBecomesBlocked(){ + public void testBecomesBlocked() { addCard(Zone.BATTLEFIELD, playerA, khenra); - addCard(Zone.BATTLEFIELD, playerB, elves ); + addCard(Zone.BATTLEFIELD, playerB, elves); attack(1, playerA, khenra); block(1, playerB, elves, khenra); @@ -27,10 +27,10 @@ public class AfflictTest extends CardTestPlayerBase { } @Test - public void testNotBlocked(){ + public void testNotBlocked() { addCard(Zone.BATTLEFIELD, playerA, khenra); - addCard(Zone.BATTLEFIELD, playerB, elves ); + addCard(Zone.BATTLEFIELD, playerB, elves); attack(1, playerA, khenra); @@ -40,4 +40,36 @@ public class AfflictTest extends CardTestPlayerBase { assertLife(playerB, 18); } + + // My afflict didn't come through after using Endless Sands on my own creature. The afflict ability was on the stack already. + @Test + public void testRemoveAfflictCreatureAfterAfflictIsOnTheStack() { + + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); + // Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.) + // {1}{R}: Frontline Devastator gets +1/+0 until end of turn. + addCard(Zone.BATTLEFIELD, playerA, "Frontline Devastator"); + + // {T}: Add {C} to your mana pool. + // {2}, {T}: Exile target creature you control. + // {4}, {T}, Sacrifice Endless Sands: Return each creature card exiled with Endless Sands to the battlefield under its owner’s control. + addCard(Zone.BATTLEFIELD, playerA, "Endless Sands"); + + // Deathtouch + // When Ruin Rat dies, exile target card from an opponent's graveyard. + addCard(Zone.BATTLEFIELD, playerB, "Ruin Rat"); // Creature 1/1 + + attack(1, playerA, "Frontline Devastator"); + block(1, playerB, "Ruin Rat", "Frontline Devastator"); + + activateAbility(1, PhaseStep.DECLARE_BLOCKERS, playerA, "{2},", "Frontline Devastator"); + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertExileCount(playerA, "Frontline Devastator", 1); + assertPermanentCount(playerB, "Ruin Rat", 1); + + assertLife(playerB, 18); + + } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/LoseLifeDefendingPlayerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/LoseLifeDefendingPlayerEffect.java index d5296bb901e..1d2fca57b26 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/LoseLifeDefendingPlayerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/LoseLifeDefendingPlayerEffect.java @@ -73,7 +73,7 @@ public class LoseLifeDefendingPlayerEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player defender = null; + Player defender; if (attackerIsSource) { defender = game.getPlayer(game.getCombat().getDefendingPlayerId(source.getSourceId(), game)); } else { diff --git a/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java b/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java index a97e4474a75..2e8feb1ceef 100644 --- a/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java @@ -1,11 +1,15 @@ package mage.abilities.keyword; +import java.util.UUID; import mage.abilities.common.BecomesBlockedTriggeredAbility; -import mage.abilities.effects.common.LoseLifeDefendingPlayerEffect; +import mage.abilities.effects.common.LoseLifeTargetEffect; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.target.targetpointer.FixedTarget; public class AfflictAbility extends BecomesBlockedTriggeredAbility { - private int lifeLoss; + private final int lifeLoss; @Override public AfflictAbility copy() { @@ -13,11 +17,23 @@ public class AfflictAbility extends BecomesBlockedTriggeredAbility { } public AfflictAbility(int amount) { - super(new LoseLifeDefendingPlayerEffect(amount, true) + super(new LoseLifeTargetEffect(amount) .setText("Afflict " + amount + " (Whenever this creature becomes blocked, defending player loses " + amount + " life.)"), false); lifeLoss = amount; } + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (super.checkTrigger(event, game)) { + UUID defenderId = game.getCombat().getDefendingPlayerId(getSourceId(), game); + if (defenderId != null) { + this.getEffects().setTargetPointer(new FixedTarget(defenderId)); + return true; + } + } + return false; + } + public AfflictAbility(final AfflictAbility afflictAbility) { super(afflictAbility); lifeLoss = afflictAbility.lifeLoss;