mirror of
https://github.com/magefree/mage.git
synced 2025-12-21 02:52:02 -08: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.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();
|
||||||
|
|
|
||||||
|
|
@ -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.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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
cards.add(targetCard);
|
if (targetCard instanceof PermanentToken) {
|
||||||
game.fireEvent(new ZoneChangeGroupEvent(cards, info.event.getSourceId(), info.event.getPlayerId(), info.event.getFromZone(), info.event.getToZone()));
|
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
|
// 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();
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue