* Woodland Champion - fixed that it doesn't trigger on tokens put (#5871);

This commit is contained in:
Oleg Agafonov 2019-07-01 12:00:10 +04:00
parent df4fd1373e
commit 699329f522
5 changed files with 71 additions and 20 deletions

View file

@ -12,7 +12,6 @@ import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeGroupEvent; import mage.game.events.ZoneChangeGroupEvent;
import mage.game.permanent.PermanentToken;
import java.util.UUID; import java.util.UUID;
@ -62,12 +61,11 @@ class WoodlandChampionTriggeredAbility extends TriggeredAbilityImpl {
public boolean checkTrigger(GameEvent event, Game game) { public boolean checkTrigger(GameEvent event, Game game) {
ZoneChangeGroupEvent zEvent = (ZoneChangeGroupEvent) event; ZoneChangeGroupEvent zEvent = (ZoneChangeGroupEvent) event;
if (zEvent != null && Zone.BATTLEFIELD == zEvent.getToZone() if (zEvent != null && Zone.BATTLEFIELD == zEvent.getToZone()
&& zEvent.getCards() != null) { && zEvent.getTokens() != null) {
int tokenCount = zEvent int tokenCount = zEvent
.getCards() .getTokens()
.stream() .stream()
.filter(card -> card instanceof PermanentToken) .mapToInt(card -> card.isControlledBy(this.getControllerId()) ? 1 : 0)
.mapToInt(card -> ((PermanentToken) card).isControlledBy(this.getControllerId()) ? 1 : 0)
.sum(); .sum();
if (tokenCount > 0) { if (tokenCount > 0) {
this.getEffects().clear(); this.getEffects().clear();

View file

@ -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();
}
}

View file

@ -19,6 +19,7 @@ import mage.game.events.ZoneChangeEvent;
import mage.game.events.ZoneChangeGroupEvent; import mage.game.events.ZoneChangeGroupEvent;
import mage.game.permanent.Battlefield; import mage.game.permanent.Battlefield;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.game.permanent.PermanentToken;
import mage.game.stack.SpellStack; import mage.game.stack.SpellStack;
import mage.game.stack.StackObject; import mage.game.stack.StackObject;
import mage.game.turn.Turn; import mage.game.turn.Turn;
@ -769,18 +770,21 @@ public class GameState implements Serializable, Copyable<GameState> {
} }
for (Map.Entry<ZoneChangeData, List<GameEvent>> entry : eventsByKey.entrySet()) { for (Map.Entry<ZoneChangeData, List<GameEvent>> entry : eventsByKey.entrySet()) {
Set<Card> movedCards = new LinkedHashSet<>(); Set<Card> movedCards = new LinkedHashSet<>();
Set<PermanentToken> movedTokens = new LinkedHashSet<>();
for (Iterator<GameEvent> it = entry.getValue().iterator(); it.hasNext(); ) { for (Iterator<GameEvent> it = entry.getValue().iterator(); it.hasNext(); ) {
GameEvent event = it.next(); GameEvent event = it.next();
ZoneChangeEvent castEvent = (ZoneChangeEvent) event; ZoneChangeEvent castEvent = (ZoneChangeEvent) event;
UUID targetId = castEvent.getTargetId(); UUID targetId = castEvent.getTargetId();
Card card = game.getCard(targetId); Card card = ZonesHandler.getTargetCard(game, targetId);
if (card != null) { if (card instanceof PermanentToken) {
movedTokens.add((PermanentToken) card);
} else if (card != null) {
movedCards.add(card); movedCards.add(card);
} }
} }
ZoneChangeData eventData = entry.getKey(); ZoneChangeData eventData = entry.getKey();
if (!movedCards.isEmpty()) { if (!movedCards.isEmpty() || !movedTokens.isEmpty()) {
ZoneChangeGroupEvent event = new ZoneChangeGroupEvent(movedCards, eventData.sourceId, eventData.playerId, eventData.fromZone, eventData.toZone); ZoneChangeGroupEvent event = new ZoneChangeGroupEvent(movedCards, movedTokens, eventData.sourceId, eventData.playerId, eventData.fromZone, eventData.toZone);
groupEvents.add(event); groupEvents.add(event);
} }
} }

View file

@ -1,6 +1,5 @@
package mage.game; package mage.game;
import java.util.*;
import mage.cards.Card; import mage.cards.Card;
import mage.cards.Cards; import mage.cards.Cards;
import mage.cards.CardsImpl; import mage.cards.CardsImpl;
@ -14,10 +13,13 @@ import mage.game.events.ZoneChangeGroupEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.game.permanent.PermanentCard; import mage.game.permanent.PermanentCard;
import mage.game.permanent.PermanentMeld; import mage.game.permanent.PermanentMeld;
import mage.game.permanent.PermanentToken;
import mage.game.stack.Spell; import mage.game.stack.Spell;
import mage.players.Player; import mage.players.Player;
import mage.target.TargetCard; import mage.target.TargetCard;
import java.util.*;
/** /**
* Created by samuelsandeen on 9/6/16. * Created by samuelsandeen on 9/6/16.
*/ */
@ -28,9 +30,14 @@ public final class ZonesHandler {
placeInDestinationZone(info, game); 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)) // 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<Card> cards = new HashSet<>(); Set<Card> cards = new HashSet<>();
Set<PermanentToken> tokens = new HashSet<>();
Card targetCard = getTargetCard(game, info.event.getTargetId()); Card targetCard = getTargetCard(game, info.event.getTargetId());
if (targetCard instanceof PermanentToken) {
tokens.add((PermanentToken) targetCard);
} else {
cards.add(targetCard); cards.add(targetCard);
game.fireEvent(new ZoneChangeGroupEvent(cards, info.event.getSourceId(), info.event.getPlayerId(), info.event.getFromZone(), info.event.getToZone())); }
game.fireEvent(new ZoneChangeGroupEvent(cards, tokens, info.event.getSourceId(), info.event.getPlayerId(), info.event.getFromZone(), info.event.getToZone()));
// normal movement // normal movement
game.fireEvent(info.event); game.fireEvent(info.event);
return true; return true;
@ -46,7 +53,7 @@ public final class ZonesHandler {
public static List<ZoneChangeInfo> moveCards(List<ZoneChangeInfo> zoneChangeInfos, Game game) { public static List<ZoneChangeInfo> moveCards(List<ZoneChangeInfo> zoneChangeInfos, Game game) {
// Handle Unmelded Meld Cards // Handle Unmelded Meld Cards
for (ListIterator<ZoneChangeInfo> itr = zoneChangeInfos.listIterator(); itr.hasNext();) { for (ListIterator<ZoneChangeInfo> itr = zoneChangeInfos.listIterator(); itr.hasNext(); ) {
ZoneChangeInfo info = itr.next(); ZoneChangeInfo info = itr.next();
MeldCard card = game.getMeldCard(info.event.getTargetId()); MeldCard card = game.getMeldCard(info.event.getTargetId());
// Copies should be handled as normal cards. // 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) { if (game.getCard(targetId) != null) {
return game.getCard(targetId); return game.getCard(targetId);
} }
@ -190,7 +197,7 @@ public final class ZonesHandler {
if (info instanceof ZoneChangeInfo.Unmelded) { if (info instanceof ZoneChangeInfo.Unmelded) {
ZoneChangeInfo.Unmelded unmelded = (ZoneChangeInfo.Unmelded) info; ZoneChangeInfo.Unmelded unmelded = (ZoneChangeInfo.Unmelded) info;
MeldCard meld = game.getMeldCard(info.event.getTargetId()); MeldCard meld = game.getMeldCard(info.event.getTargetId());
for (Iterator<ZoneChangeInfo> itr = unmelded.subInfo.iterator(); itr.hasNext();) { for (Iterator<ZoneChangeInfo> itr = unmelded.subInfo.iterator(); itr.hasNext(); ) {
ZoneChangeInfo subInfo = itr.next(); ZoneChangeInfo subInfo = itr.next();
if (!maybeRemoveFromSourceZone(subInfo, game)) { if (!maybeRemoveFromSourceZone(subInfo, game)) {
itr.remove(); itr.remove();

View file

@ -1,13 +1,13 @@
package mage.game.events; package mage.game.events;
import mage.cards.Card;
import mage.constants.Zone;
import mage.game.permanent.PermanentToken;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import mage.cards.Card;
import mage.constants.Zone;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public class ZoneChangeGroupEvent extends GameEvent { public class ZoneChangeGroupEvent extends GameEvent {
@ -15,12 +15,14 @@ public class ZoneChangeGroupEvent extends GameEvent {
private final Zone fromZone; private final Zone fromZone;
private final Zone toZone; private final Zone toZone;
private final Set<Card> cards; private final Set<Card> cards;
private final Set<PermanentToken> tokens;
public ZoneChangeGroupEvent(Set<Card> cards, UUID sourceId, UUID playerId, Zone fromZone, Zone toZone) { public ZoneChangeGroupEvent(Set<Card> cards, Set<PermanentToken> tokens, UUID sourceId, UUID playerId, Zone fromZone, Zone toZone) {
super(EventType.ZONE_CHANGE_GROUP, null, sourceId, playerId); super(EventType.ZONE_CHANGE_GROUP, null, sourceId, playerId);
this.fromZone = fromZone; this.fromZone = fromZone;
this.toZone = toZone; this.toZone = toZone;
this.cards = cards; this.cards = cards;
this.tokens = tokens;
} }
public Zone getFromZone() { public Zone getFromZone() {
@ -35,4 +37,8 @@ public class ZoneChangeGroupEvent extends GameEvent {
return cards; return cards;
} }
public Set<PermanentToken> getTokens() {
return tokens;
}
} }