diff --git a/Mage.Sets/src/mage/cards/w/WoodlandChampion.java b/Mage.Sets/src/mage/cards/w/WoodlandChampion.java index cfd8d3bc7b0..ffb29d4ac8d 100644 --- a/Mage.Sets/src/mage/cards/w/WoodlandChampion.java +++ b/Mage.Sets/src/mage/cards/w/WoodlandChampion.java @@ -12,7 +12,6 @@ import mage.counters.CounterType; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.ZoneChangeGroupEvent; -import mage.game.permanent.PermanentToken; import java.util.UUID; @@ -62,12 +61,11 @@ class WoodlandChampionTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { ZoneChangeGroupEvent zEvent = (ZoneChangeGroupEvent) event; if (zEvent != null && Zone.BATTLEFIELD == zEvent.getToZone() - && zEvent.getCards() != null) { + && zEvent.getTokens() != null) { int tokenCount = zEvent - .getCards() + .getTokens() .stream() - .filter(card -> card instanceof PermanentToken) - .mapToInt(card -> ((PermanentToken) card).isControlledBy(this.getControllerId()) ? 1 : 0) + .mapToInt(card -> card.isControlledBy(this.getControllerId()) ? 1 : 0) .sum(); if (tokenCount > 0) { this.getEffects().clear(); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/WoodlandChampionTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/WoodlandChampionTest.java new file mode 100644 index 00000000000..97f1fe0b212 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/WoodlandChampionTest.java @@ -0,0 +1,36 @@ +package org.mage.test.cards.triggers; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.CounterType; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author JayDi85 + */ +public class WoodlandChampionTest extends CardTestPlayerBase { + + // Woodland Champion {1}{G} + // Whenever one or more tokens enter the battlefield under your control, put that many +1/+1 counters on Woodland Champion. + + @Test + public void test_TriggerOnTwoTokens() { + addCard(Zone.BATTLEFIELD, playerA, "Woodland Champion", 1); + // Acorn Harvest {3}{G} + // Create two 1/1 green Squirrel creature tokens. + addCard(Zone.HAND, playerA, "Acorn Harvest", 6); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 4); + + checkPermanentCounters("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Woodland Champion", CounterType.P1P1, 0); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Acorn Harvest"); + + checkPermanentCount("after", 1, PhaseStep.BEGIN_COMBAT, playerA, "Squirrel", 2); + checkPermanentCounters("after", 1, PhaseStep.BEGIN_COMBAT, playerA, "Woodland Champion", CounterType.P1P1, 2); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.END_TURN); + execute(); + assertAllCommandsUsed(); + } +} diff --git a/Mage/src/main/java/mage/game/GameState.java b/Mage/src/main/java/mage/game/GameState.java index ffd3c42ebb5..21efc769a75 100644 --- a/Mage/src/main/java/mage/game/GameState.java +++ b/Mage/src/main/java/mage/game/GameState.java @@ -19,6 +19,7 @@ import mage.game.events.ZoneChangeEvent; import mage.game.events.ZoneChangeGroupEvent; import mage.game.permanent.Battlefield; import mage.game.permanent.Permanent; +import mage.game.permanent.PermanentToken; import mage.game.stack.SpellStack; import mage.game.stack.StackObject; import mage.game.turn.Turn; @@ -769,18 +770,21 @@ public class GameState implements Serializable, Copyable { } for (Map.Entry> entry : eventsByKey.entrySet()) { Set movedCards = new LinkedHashSet<>(); + Set movedTokens = new LinkedHashSet<>(); for (Iterator it = entry.getValue().iterator(); it.hasNext(); ) { GameEvent event = it.next(); ZoneChangeEvent castEvent = (ZoneChangeEvent) event; UUID targetId = castEvent.getTargetId(); - Card card = game.getCard(targetId); - if (card != null) { + Card card = ZonesHandler.getTargetCard(game, targetId); + if (card instanceof PermanentToken) { + movedTokens.add((PermanentToken) card); + } else if (card != null) { movedCards.add(card); } } ZoneChangeData eventData = entry.getKey(); - if (!movedCards.isEmpty()) { - ZoneChangeGroupEvent event = new ZoneChangeGroupEvent(movedCards, eventData.sourceId, eventData.playerId, eventData.fromZone, eventData.toZone); + if (!movedCards.isEmpty() || !movedTokens.isEmpty()) { + ZoneChangeGroupEvent event = new ZoneChangeGroupEvent(movedCards, movedTokens, eventData.sourceId, eventData.playerId, eventData.fromZone, eventData.toZone); groupEvents.add(event); } } diff --git a/Mage/src/main/java/mage/game/ZonesHandler.java b/Mage/src/main/java/mage/game/ZonesHandler.java index c6eeff31423..c4440bab1b3 100644 --- a/Mage/src/main/java/mage/game/ZonesHandler.java +++ b/Mage/src/main/java/mage/game/ZonesHandler.java @@ -1,6 +1,5 @@ package mage.game; -import java.util.*; import mage.cards.Card; import mage.cards.Cards; import mage.cards.CardsImpl; @@ -14,10 +13,13 @@ import mage.game.events.ZoneChangeGroupEvent; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentCard; import mage.game.permanent.PermanentMeld; +import mage.game.permanent.PermanentToken; import mage.game.stack.Spell; import mage.players.Player; import mage.target.TargetCard; +import java.util.*; + /** * Created by samuelsandeen on 9/6/16. */ @@ -28,9 +30,14 @@ public final class ZonesHandler { placeInDestinationZone(info, game); // create a group zone change event if a card is moved to stack for casting (it's always only one card, but some effects check for group events (one or more xxx)) Set cards = new HashSet<>(); + Set tokens = new HashSet<>(); Card targetCard = getTargetCard(game, info.event.getTargetId()); - cards.add(targetCard); - game.fireEvent(new ZoneChangeGroupEvent(cards, info.event.getSourceId(), info.event.getPlayerId(), info.event.getFromZone(), info.event.getToZone())); + if (targetCard instanceof PermanentToken) { + tokens.add((PermanentToken) targetCard); + } else { + cards.add(targetCard); + } + game.fireEvent(new ZoneChangeGroupEvent(cards, tokens, info.event.getSourceId(), info.event.getPlayerId(), info.event.getFromZone(), info.event.getToZone())); // normal movement game.fireEvent(info.event); return true; @@ -46,7 +53,7 @@ public final class ZonesHandler { public static List moveCards(List zoneChangeInfos, Game game) { // Handle Unmelded Meld Cards - for (ListIterator itr = zoneChangeInfos.listIterator(); itr.hasNext();) { + for (ListIterator itr = zoneChangeInfos.listIterator(); itr.hasNext(); ) { ZoneChangeInfo info = itr.next(); MeldCard card = game.getMeldCard(info.event.getTargetId()); // Copies should be handled as normal cards. @@ -172,7 +179,7 @@ public final class ZonesHandler { } } - private static Card getTargetCard(Game game, UUID targetId) { + public static Card getTargetCard(Game game, UUID targetId) { if (game.getCard(targetId) != null) { return game.getCard(targetId); } @@ -190,7 +197,7 @@ public final class ZonesHandler { if (info instanceof ZoneChangeInfo.Unmelded) { ZoneChangeInfo.Unmelded unmelded = (ZoneChangeInfo.Unmelded) info; MeldCard meld = game.getMeldCard(info.event.getTargetId()); - for (Iterator itr = unmelded.subInfo.iterator(); itr.hasNext();) { + for (Iterator itr = unmelded.subInfo.iterator(); itr.hasNext(); ) { ZoneChangeInfo subInfo = itr.next(); if (!maybeRemoveFromSourceZone(subInfo, game)) { itr.remove(); diff --git a/Mage/src/main/java/mage/game/events/ZoneChangeGroupEvent.java b/Mage/src/main/java/mage/game/events/ZoneChangeGroupEvent.java index abb2f926203..213f3a39d97 100644 --- a/Mage/src/main/java/mage/game/events/ZoneChangeGroupEvent.java +++ b/Mage/src/main/java/mage/game/events/ZoneChangeGroupEvent.java @@ -1,13 +1,13 @@ - package mage.game.events; +import mage.cards.Card; +import mage.constants.Zone; +import mage.game.permanent.PermanentToken; + import java.util.Set; import java.util.UUID; -import mage.cards.Card; -import mage.constants.Zone; /** - * * @author LevelX2 */ public class ZoneChangeGroupEvent extends GameEvent { @@ -15,12 +15,14 @@ public class ZoneChangeGroupEvent extends GameEvent { private final Zone fromZone; private final Zone toZone; private final Set cards; + private final Set tokens; - public ZoneChangeGroupEvent(Set cards, UUID sourceId, UUID playerId, Zone fromZone, Zone toZone) { + public ZoneChangeGroupEvent(Set cards, Set tokens, UUID sourceId, UUID playerId, Zone fromZone, Zone toZone) { super(EventType.ZONE_CHANGE_GROUP, null, sourceId, playerId); this.fromZone = fromZone; this.toZone = toZone; this.cards = cards; + this.tokens = tokens; } public Zone getFromZone() { @@ -35,4 +37,8 @@ public class ZoneChangeGroupEvent extends GameEvent { return cards; } + public Set getTokens() { + return tokens; + } + }