mirror of
https://github.com/correl/mage.git
synced 2025-03-12 17:00:08 -09:00
* Woodland Champion - fixed that it doesn't trigger on tokens put (#5871);
This commit is contained in:
parent
df4fd1373e
commit
699329f522
5 changed files with 71 additions and 20 deletions
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue