diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/CreepingDread.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/CreepingDread.java index 43fee7ef2e9..be70020b0a1 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/CreepingDread.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/CreepingDread.java @@ -27,10 +27,10 @@ */ package mage.sets.shadowsoverinnistrad; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -102,7 +102,7 @@ class CreepingDreadEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - List typesChosen = new ArrayList<>(); + Set typesChosen = new HashSet<>(); Map cardsChosen = new HashMap<>(); if(!controller.getHand().isEmpty()) { @@ -110,13 +110,13 @@ class CreepingDreadEffect extends OneShotEffect { if(controller.choose(Outcome.Discard, controller.getHand(), controllerTarget, game)) { Card card = controller.getHand().get(controllerTarget.getFirstTarget(), game); if (card != null) { - typesChosen = card.getCardType(); + typesChosen = new HashSet<>(card.getCardType()); cardsChosen.put(controller, card); } } } - ArrayList opponentsAffected = new ArrayList<>(); + Set opponentsAffected = new HashSet<>(); for (UUID playerId : game.getOpponents(source.getControllerId())) { Player opponent = game.getPlayer(playerId); // opponent discards a card - if it is same card type as controller, add to opponentsAffected @@ -141,13 +141,6 @@ class CreepingDreadEffect extends OneShotEffect { } } } - - // each opponent who discarded a card of the same type loses 3 life - if (!opponentsAffected.isEmpty()) { - for(Player opponent : opponentsAffected) { - opponent.loseLife(3, game); - } - } // everyone discards the card at the same time if (!cardsChosen.isEmpty()) { @@ -158,6 +151,13 @@ class CreepingDreadEffect extends OneShotEffect { player.discard(cardChosen, source, game); } } + } + + // each opponent who discarded a card of the same type loses 3 life + if (!opponentsAffected.isEmpty()) { + for(Player opponent : opponentsAffected) { + opponent.loseLife(3, game); + } } return true; diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/soi/ArchangelAvacynTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/soi/ArchangelAvacynTest.java new file mode 100644 index 00000000000..17c87cac193 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/soi/ArchangelAvacynTest.java @@ -0,0 +1,56 @@ +package org.mage.test.cards.single.soi; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.game.permanent.Permanent; +import org.junit.Assert; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * {3}{W}{W} Angel - day + * + Flash + Flying, vigilance + When Archangel Avacyn enters the battlefield, creatures you control gain indestructible until end of turn. + * When a non-Angel creature you control dies, transform Archangel Avacyn at the beginning of the next upkeep. + * + * (Night) - red card + * When this creature transforms into Avacyn, the Purifier, it deals 3 damage to each other creature and each opponent. + * + * @author escplan9 (Derek Monturo - dmontur1 at gmail dot com) + */ +public class ArchangelAvacynTest extends CardTestPlayerBase { + + /** + * Reported bug: "Archangel Avacyn damages herself when she transforms" + */ + @Test + public void basicTransformTest() { + + addCard(Zone.BATTLEFIELD, playerA, "Archangel Avacyn"); + addCard(Zone.BATTLEFIELD, playerA, "Wall of Omens"); // 0/4 + addCard(Zone.HAND, playerA, "Elite Vanguard"); // 2/1 + addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); + addCard(Zone.BATTLEFIELD, playerB, "Hill Giant"); // 3/1 + addCard(Zone.BATTLEFIELD, playerB, "Wall of Roots"); // 0/5 + addCard(Zone.HAND, playerB, "Shock"); + addCard(Zone.BATTLEFIELD, playerB, "Mountain", 2); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Elite Vanguard"); + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Shock"); + addTarget(playerB, "Elite Vanguard"); + setStopAt(3, PhaseStep.DRAW); + execute(); + + assertPermanentCount(playerA, "Avacyn, the Purifier", 1); + assertPermanentCount(playerA, "Wall of Omens", 1); + assertGraveyardCount(playerA, "Elite Vanguard", 1); + assertPermanentCount(playerB, "Wall of Roots", 1); + assertGraveyardCount(playerB, "Hill Giant", 1); + assertGraveyardCount(playerB, "Shock", 1); + + Permanent avacyn = getPermanent("Avacyn, the Purifier", playerA); + Assert.assertEquals("Damage to Avacyn, the Purifier should be 0 not 3", 0, avacyn.getDamage()); + } +}