diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/akh/BontuTheGlorifiedTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/akh/BontuTheGlorifiedTest.java index bda5943784..bdca53426b 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/akh/BontuTheGlorifiedTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/akh/BontuTheGlorifiedTest.java @@ -7,11 +7,14 @@ import org.mage.test.serverside.base.CardTestPlayerBase; public class BontuTheGlorifiedTest extends CardTestPlayerBase { + //Menace + //Indestructible + //Bontu the Glorified can't attack or block unless a creature died under your control this turn. + //{1}{B}, Sacrifice another creature: Scry 1. Each opponent loses 1 life and you gain 1 life. String bontu = "Bontu the Glorified"; String swamp = "Swamp"; String grizzly = "Grizzly Bears"; - @Test public void testBontuNotAttack() { addCard(Zone.BATTLEFIELD, playerA, bontu); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/akh/HapatraVizierOfPoisonsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/akh/HapatraVizierOfPoisonsTest.java index c665211aeb..21c6fc1525 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/akh/HapatraVizierOfPoisonsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/akh/HapatraVizierOfPoisonsTest.java @@ -12,60 +12,60 @@ import org.mage.test.serverside.base.CardTestPlayerBase; * @author escplan9 */ public class HapatraVizierOfPoisonsTest extends CardTestPlayerBase { - - /* + + /* Hapatra, Vizier of Poisons BG Legendary Creature - Human Cleric 2/2 Whenever Hapatra, Vizier of Poisons deals combat damage to a player, you may put a -1/-1 counter on target creature. - Whenever you put one or more -1/-1 counters on a creature, create a 1/1 green Snake creature token with deathtouch. - */ - private String hapatra = "Hapatra, Vizier of Poisons"; + Whenever you put one or more -1/-1 counters on a creature, create a 1/1 green Snake creature token with deathtouch. + */ + private final String hapatra = "Hapatra, Vizier of Poisons"; @Test public void hapatraCombatDamageToPlayer() { - + String gBears = "Grizzly Bears"; addCard(Zone.BATTLEFIELD, playerA, hapatra); addCard(Zone.BATTLEFIELD, playerB, gBears); - + attack(3, playerA, hapatra); setChoice(playerA, "Yes"); // opt to place -1/-1 counter on creature addTarget(playerA, gBears); - + setStopAt(3, PhaseStep.END_COMBAT); execute(); - + assertLife(playerB, 18); assertCounterCount(playerB, gBears, CounterType.M1M1, 1); assertPowerToughness(playerB, gBears, 1, 1); // 2/2 with -1/1 counter assertPermanentCount(playerA, "Snake", 1); assertAbility(playerA, "Snake", DeathtouchAbility.getInstance(), true); } - + /* - Test is failing due to bug: issue #3288. + Issue #3288. Hapatra, Vizier of Poisons is not triggering off of Infect. Tested with Blight Mamba - */ + */ @Test public void infectDamageTriggersHapatra() { - - String bMamba = "Blight Mamba"; // {1}{G} 1/1 Creature - Snake, Infect with {1}{G}:Regen + + String bMamba = "Blight Mamba"; // {1}{G} 1/1 Creature - Snake, Infect with {1}{G}:Regen String wOmens = "Wall of Omens"; // {1}{W} 0/4 defender ETB: draw a card - + addCard(Zone.BATTLEFIELD, playerA, hapatra); addCard(Zone.BATTLEFIELD, playerA, bMamba); addCard(Zone.BATTLEFIELD, playerB, wOmens); - + attack(3, playerA, bMamba); block(3, playerB, wOmens, bMamba); - + setStopAt(3, PhaseStep.END_COMBAT); execute(); - + assertLife(playerB, 20); assertCounterCount(playerB, CounterType.POISON, 0); - assertCounterCount(playerB, wOmens, CounterType.M1M1, 1); assertPowerToughness(playerB, wOmens, -1, 3); // 0/4 with -1/-1 counter + assertCounterCount(playerB, wOmens, CounterType.M1M1, 1); assertPermanentCount(playerA, "Snake", 1); assertAbility(playerA, "Snake", DeathtouchAbility.getInstance(), true); } diff --git a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java index c0659276c3..589038d04f 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java @@ -27,6 +27,7 @@ */ package mage.game.permanent; +import java.util.*; import mage.MageObject; import mage.MageObjectReference; import mage.ObjectColor; @@ -55,13 +56,21 @@ import mage.players.Player; import mage.util.GameLog; import mage.util.ThreadLocalStringBuilder; -import java.util.*; - /** * @author BetaSteward_at_googlemail.com */ public abstract class PermanentImpl extends CardImpl implements Permanent { + public class MarkedDamageInfo { + + public MarkedDamageInfo(Counter counter, MageObject sourceObject) { + this.counter = counter; + this.sourceObject = sourceObject; + } + Counter counter; + MageObject sourceObject; + } + private static final ThreadLocalStringBuilder threadLocalBuilder = new ThreadLocalStringBuilder(300); protected boolean tapped; @@ -96,7 +105,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { protected int attachedToZoneChangeCounter; protected MageObjectReference pairedPermanent; protected Counters counters; - protected List<Counter> markedDamage; + protected List<MarkedDamageInfo> markedDamage; protected int timesLoyaltyUsed = 0; protected Map<String, String> info; protected int createOrder; @@ -141,8 +150,8 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { } if (permanent.markedDamage != null) { markedDamage = new ArrayList<>(); - for (Counter counter : permanent.markedDamage) { - markedDamage.add(counter.copy()); + for (MarkedDamageInfo mdi : permanent.markedDamage) { + markedDamage.add(new MarkedDamageInfo(mdi.counter.copy(), mdi.sourceObject)); } } if (permanent.info != null) { @@ -768,8 +777,12 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { if (markedDamage == null) { return 0; } - for (Counter counter : markedDamage) { - addCounters(counter, null, game); + for (MarkedDamageInfo mdi : markedDamage) { + Ability source = null; + if (mdi.sourceObject instanceof Permanent) { + source = ((Permanent) mdi.sourceObject).getSpellAbility(); + } + addCounters(mdi.counter, source, game); } markedDamage.clear(); return 0; @@ -811,10 +824,14 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { || source.getAbilities().containsKey(WitherAbility.getInstance().getId()))) { if (markDamage) { // mark damage only - markDamage(CounterType.M1M1.createInstance(actualDamage)); + markDamage(CounterType.M1M1.createInstance(actualDamage), source); } else { + Ability damageSourceAbility = null; + if (source instanceof Permanent) { + damageSourceAbility = ((Permanent) source).getSpellAbility(); + } // deal damage immediately - addCounters(CounterType.M1M1.createInstance(actualDamage), null, game); + addCounters(CounterType.M1M1.createInstance(actualDamage), damageSourceAbility, game); } } else { this.damage += actualDamage; @@ -840,11 +857,11 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { return event.getAmount(); } - private void markDamage(Counter counter) { + private void markDamage(Counter counter, MageObject source) { if (markedDamage == null) { markedDamage = new ArrayList<>(); } - markedDamage.add(counter); + markedDamage.add(new MarkedDamageInfo(counter, source)); } @Override