* 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.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();

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.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<GameState> {
}
for (Map.Entry<ZoneChangeData, List<GameEvent>> entry : eventsByKey.entrySet()) {
Set<Card> movedCards = new LinkedHashSet<>();
Set<PermanentToken> movedTokens = new LinkedHashSet<>();
for (Iterator<GameEvent> 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);
}
}

View file

@ -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<Card> cards = new HashSet<>();
Set<PermanentToken> 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<ZoneChangeInfo> moveCards(List<ZoneChangeInfo> zoneChangeInfos, Game game) {
// Handle Unmelded Meld Cards
for (ListIterator<ZoneChangeInfo> itr = zoneChangeInfos.listIterator(); itr.hasNext();) {
for (ListIterator<ZoneChangeInfo> 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<ZoneChangeInfo> itr = unmelded.subInfo.iterator(); itr.hasNext();) {
for (Iterator<ZoneChangeInfo> itr = unmelded.subInfo.iterator(); itr.hasNext(); ) {
ZoneChangeInfo subInfo = itr.next();
if (!maybeRemoveFromSourceZone(subInfo, game)) {
itr.remove();

View file

@ -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<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);
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<PermanentToken> getTokens() {
return tokens;
}
}