diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/FathomMageTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/FathomMageTest.java new file mode 100644 index 00000000000..dd8d4dd9391 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/FathomMageTest.java @@ -0,0 +1,56 @@ +package org.mage.test.cards.triggers; + +import mage.Constants; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author LevelX2 + */ +public class FathomMageTest extends CardTestPlayerBase { + + /** + * Fathom Mage - Creature — Human Wizard 1/1, 2UG + * + * Evolve (Whenever a creature enters the battlefield under your control, if that creature has greater power or toughness than this creature, put a +1/+1 counter on this creature.) + * Whenever a +1/+1 counter is placed on Fathom Mage, you may draw a card. + * + + */ + @Test + public void testDrawCardsAddedCounters() { + // card draw triggered ability will trigger once for each of those counters from Blessings of Nature. + + addCard(Constants.Zone.HAND, playerA, "Blessings of Nature"); + addCard(Constants.Zone.BATTLEFIELD, playerA, "Fathom Mage", 1); + addCard(Constants.Zone.BATTLEFIELD, playerA, "Forest", 5); + + castSpell(1, Constants.PhaseStep.PRECOMBAT_MAIN, playerA, "Blessings of Nature", "Fathom Mage"); + + setStopAt(1, Constants.PhaseStep.END_TURN); + execute(); + + assertPermanentCount(playerA, "Fathom Mage", 1); + assertPowerToughness(playerA, "Fathom Mage", 5, 5); + assertHandCount(playerA, 4); + } + + @Test + public void testDrawCardsEntersTheBattlefield() { + // card draw triggered ability will trigger once for each of those counters from Master Biomancer. + + addCard(Constants.Zone.HAND, playerA, "Fathom Mage"); + addCard(Constants.Zone.BATTLEFIELD, playerA, "Master Biomancer", 1); + addCard(Constants.Zone.BATTLEFIELD, playerA, "Forest", 4); + addCard(Constants.Zone.BATTLEFIELD, playerA, "Island", 4); + + castSpell(1, Constants.PhaseStep.PRECOMBAT_MAIN, playerA, "Fathom Mage"); + + setStopAt(1, Constants.PhaseStep.END_TURN); + execute(); + + assertPermanentCount(playerA, "Fathom Mage", 1); + assertPowerToughness(playerA, "Fathom Mage", 3, 3); + assertHandCount(playerA, 2); + } +} diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index 4fda9530578..0f8b6315d7c 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -52,6 +52,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.UUID; +import mage.target.common.TargetCreaturePermanentAmount; /** * @@ -297,7 +298,15 @@ public class TestPlayer extends ComputerPlayer { if (ability.getTargets().get(index).getNumberOfTargets() == 1) { ability.getTargets().get(index).clearChosen(); } - ability.getTargets().get(index).addTarget(id, ability, game); + if (ability.getTargets().get(index) instanceof TargetCreaturePermanentAmount) { + // supports only to set the complete amount to one target + TargetCreaturePermanentAmount targetAmount = (TargetCreaturePermanentAmount) ability.getTargets().get(index); + targetAmount.setAmount(ability, game); + int amount = targetAmount.getAmountRemaining(); + targetAmount.addTarget(id, amount,ability, game); + } else { + ability.getTargets().get(index).addTarget(id, ability, game); + } index++; break; } diff --git a/Mage/src/mage/cards/CardImpl.java b/Mage/src/mage/cards/CardImpl.java index bc377600b31..4ea0a8ef489 100644 --- a/Mage/src/mage/cards/CardImpl.java +++ b/Mage/src/mage/cards/CardImpl.java @@ -539,11 +539,13 @@ public abstract class CardImpl> extends MageObjectImpl @Override public void addCounters(String name, int amount, Game game, ArrayList appliedEffects) { - GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, ownerId, name, amount); - event.setAppliedEffects(appliedEffects); - if (!game.replaceEvent(event)) { - counters.addCounter(name, amount); - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, ownerId, name, amount)); + for (int i = 0; i < amount; i++) { + GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, ownerId, name, amount); + event.setAppliedEffects(appliedEffects); + if (!game.replaceEvent(event)) { + counters.addCounter(name, amount); + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, ownerId, name, amount)); + } } } @@ -554,11 +556,16 @@ public abstract class CardImpl> extends MageObjectImpl @Override public void addCounters(Counter counter, Game game, ArrayList appliedEffects) { - GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, ownerId, counter.getName(), counter.getCount()); - event.setAppliedEffects(appliedEffects); - if (!game.replaceEvent(event)) { - counters.addCounter(counter); - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, ownerId, counter.getName(), counter.getCount())); + int amount = counter.getCount(); + for (int i = 0; i < amount; i++) { + Counter eventCounter = counter.copy(); + eventCounter.remove(amount - 1); + GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, ownerId, counter.getName(), counter.getCount()); + event.setAppliedEffects(appliedEffects); + if (!game.replaceEvent(event)) { + counters.addCounter(eventCounter); + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, ownerId, counter.getName(), counter.getCount())); + } } } diff --git a/Mage/src/mage/game/permanent/PermanentImpl.java b/Mage/src/mage/game/permanent/PermanentImpl.java index c07f56d7c84..0e3d2f4dfbb 100644 --- a/Mage/src/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/mage/game/permanent/PermanentImpl.java @@ -222,21 +222,28 @@ public abstract class PermanentImpl> extends CardImpl @Override public void addCounters(String name, int amount, Game game, ArrayList appliedEffects) { - GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, controllerId, name, amount); - event.setAppliedEffects(appliedEffects); - if (!game.replaceEvent(event)) { - counters.addCounter(name, amount); - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, controllerId, name, amount)); + for (int i = 0; i < amount; i++) { + GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, controllerId, name, 1); + event.setAppliedEffects(appliedEffects); + if (!game.replaceEvent(event)) { + counters.addCounter(name, 1); + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, controllerId, name, 1)); + } } } @Override public void addCounters(Counter counter, Game game, ArrayList appliedEffects) { - GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, controllerId, counter.getName(), counter.getCount()); - event.setAppliedEffects(appliedEffects); - if (!game.replaceEvent(event)) { - counters.addCounter(counter); - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, controllerId, counter.getName(), counter.getCount())); + int amount = counter.getCount(); + for (int i = 0; i < amount; i++) { + Counter eventCounter = counter.copy(); + eventCounter.remove(amount - 1); + GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, controllerId, counter.getName(), 1); + event.setAppliedEffects(appliedEffects); + if (!game.replaceEvent(event)) { + counters.addCounter(eventCounter); + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, controllerId, counter.getName(), 1)); + } } } diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index f1c47c3de7f..8f793935c72 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -956,9 +956,14 @@ public abstract class PlayerImpl> implements Player, Ser @Override public void addCounters(Counter counter, Game game) { - if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, playerId, playerId, counter.getName(), counter.getCount()))) { - counters.addCounter(counter); - game.fireEvent(GameEvent.getEvent(EventType.COUNTER_ADDED, playerId, playerId, counter.getName(), counter.getCount())); + int amount = counter.getCount(); + for (int i = 0; i < amount; i++) { + Counter eventCounter = counter.copy(); + eventCounter.remove(amount - 1); + if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, playerId, playerId, counter.getName(), counter.getCount()))) { + counters.addCounter(eventCounter); + game.fireEvent(GameEvent.getEvent(EventType.COUNTER_ADDED, playerId, playerId, counter.getName(), counter.getCount())); + } } }