diff --git a/Mage.Sets/src/mage/cards/a/AgrusKosEternalSoldier.java b/Mage.Sets/src/mage/cards/a/AgrusKosEternalSoldier.java index 994590006af..b79699c7004 100644 --- a/Mage.Sets/src/mage/cards/a/AgrusKosEternalSoldier.java +++ b/Mage.Sets/src/mage/cards/a/AgrusKosEternalSoldier.java @@ -19,9 +19,11 @@ import mage.filter.predicate.mageobject.MageObjectReferencePredicate; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; +import mage.game.stack.Spell; import mage.game.stack.StackObject; import mage.players.Player; import mage.target.Target; +import mage.util.CardUtil; import java.util.Collection; import java.util.List; @@ -88,11 +90,14 @@ class AgrusKosEternalSoldierTriggeredAbility extends TriggeredAbilityImpl { if (!event.getTargetId().equals(getSourceId())) { return false; } - StackObject stackObject = game.getStack().getStackObject(event.getSourceId()); - if (stackObject == null) { + StackObject targetingObject = CardUtil.getTargetingStackObject(event, game); + if (targetingObject == null || targetingObject instanceof Spell) { return false; } - Set targets = stackObject + if (!CardUtil.checkTargetMap(this.id, targetingObject, event, game)) { + return false; + } + Set targets = targetingObject .getStackAbility() .getTargets() .stream() @@ -102,7 +107,7 @@ class AgrusKosEternalSoldierTriggeredAbility extends TriggeredAbilityImpl { if (targets.isEmpty() || !targets.stream().allMatch(getSourceId()::equals)) { return false; } - this.getEffects().setValue("triggeringAbility", stackObject); + this.getEffects().setValue("triggeringAbility", targetingObject); return true; } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/j22/AgrusKosEternalSoldierTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/j22/AgrusKosEternalSoldierTest.java new file mode 100644 index 00000000000..0df627d9194 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/j22/AgrusKosEternalSoldierTest.java @@ -0,0 +1,70 @@ +package org.mage.test.cards.single.j22; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author xenohedron + */ +public class AgrusKosEternalSoldierTest extends CardTestPlayerBase { + + private static final String agrus = "Agrus Kos, Eternal Soldier"; // 3/4 Vigilance + // Whenever Agrus Kos, Eternal Soldier becomes the target of an ability that targets only it, you may pay {1}{R/W}. + // If you do, copy that ability for each other creature you control that ability could target. Each copy targets a different one of those creatures. + private static final String sparkmage = "Cunning Sparkmage"; // 0/1 Haste pinger + private static final String turtle = "Horned Turtle"; // 1/4 + private static final String firewalker = "Kor Firewalker"; // 2/2 protection from red + // Whenever a player casts a red spell, you may gain 1 life. + + @Test + public void testTriggerCopiesAbility() { + setStrictChooseMode(true); + + addCard(Zone.BATTLEFIELD, playerA, agrus); + addCard(Zone.BATTLEFIELD, playerA, turtle); + addCard(Zone.BATTLEFIELD, playerA, firewalker); + addCard(Zone.BATTLEFIELD, playerB, sparkmage); + addCard(Zone.BATTLEFIELD, playerA, "Plateau", 2); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerB, "{T}: {this} deals", agrus); + setChoice(playerA, true); // pay to copy + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTapped(sparkmage, true); + assertTappedCount("Plateau", true, 2); + assertDamageReceived(playerA, agrus, 1); + assertDamageReceived(playerA, turtle, 1); + assertDamageReceived(playerA, firewalker, 0); + assertLife(playerA, 20); + assertLife(playerB, 20); + } + + @Test + public void testTriggerDoesntCopySpell() { + setStrictChooseMode(true); + + String shock = "Shock"; + addCard(Zone.BATTLEFIELD, playerA, agrus); + addCard(Zone.BATTLEFIELD, playerA, turtle); + addCard(Zone.BATTLEFIELD, playerA, firewalker); + addCard(Zone.HAND, playerB, shock); + addCard(Zone.BATTLEFIELD, playerB, "Plateau"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, shock, agrus); + setChoice(playerA, true); // gain 1 life + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertDamageReceived(playerA, agrus, 2); + assertDamageReceived(playerA, turtle, 0); + assertDamageReceived(playerA, firewalker, 0); + assertLife(playerA, 21); + assertLife(playerB, 20); + } + +}