From 0e665dc673c02d70b0da3ecacbf15077e5cd25e9 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 12 Nov 2019 13:31:16 +0800 Subject: [PATCH 1/2] Fix Amass ability (Woodland Champion and Dreadhorde Invasion) --- .../game/ability/effects/AmassEffect.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java index 1d15998fe9c..960a0c38563 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java @@ -8,6 +8,7 @@ import forge.game.card.Card; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.card.CardPredicates; +import forge.game.card.CardZoneTable; import forge.game.card.CounterType; import forge.game.card.token.TokenInfo; import forge.game.event.GameEventTokenCreated; @@ -44,6 +45,17 @@ public class AmassEffect extends SpellAbilityEffect { final int amount = AbilityUtils.calculateAmount(card, sa.getParamOrDefault("Num", "1"), sa); final boolean remember = sa.hasParam("RememberAmass"); + boolean useZoneTable = true; + CardZoneTable triggerList = sa.getChangeZoneTable(); + if (triggerList == null) { + triggerList = new CardZoneTable(); + useZoneTable = false; + } + if (sa.hasParam("ChangeZoneTable")) { + sa.setChangeZoneTable(triggerList); + useZoneTable = true; + } + // create army token if needed if (CardLists.count(activator.getCardsIn(ZoneType.Battlefield), CardPredicates.isType("Army")) == 0) { final String tokenScript = "b_0_0_zombie_army"; @@ -54,9 +66,16 @@ public class AmassEffect extends SpellAbilityEffect { // Should this be catching the Card that's returned? Card c = game.getAction().moveToPlay(tok, sa); + if (c.getZone() != null) { + triggerList.put(ZoneType.None, c.getZone().getZoneType(), c); + } c.updateStateForView(); } + if (!useZoneTable) { + triggerList.triggerChangesZoneAll(game); + triggerList.clear(); + } game.fireEvent(new GameEventTokenCreated()); } From 0c904e208a59a696ef8e85b8157394ce615e031e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 12 Nov 2019 19:49:01 +0800 Subject: [PATCH 2/2] Add AmassTrigger Test (If Woodland Champion will trigger from Eternal Skylord Amass Ability) --- .../ai/simulation/GameSimulatorTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java index 7b7fc22d6fa..1fd4c78d83e 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java @@ -2093,4 +2093,34 @@ public class GameSimulatorTest extends SimulationTestCase { assertEquals(1, numForest); assertEquals(0, simGame.getPlayers().get(1).getCardsIn(ZoneType.Battlefield).size()); } + + public void testAmassTrigger() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + String WCname = "Woodland Champion"; + addCard(WCname, p); + for (int i = 0; i < 5; i++) + addCard("Island", p); + + String CardName = "Eternal Skylord"; + Card c = addCardToZone(CardName, p, ZoneType.Hand); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + + SpellAbility playSa = c.getSpellAbilities().get(0); + playSa.setActivatingPlayer(p); + + GameSimulator sim = createSimulator(game, p); + int origScore = sim.getScoreForOrigGame().value; + int score = sim.simulateSpellAbility(playSa).value; + assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); + + Game simGame = sim.getSimulatedGameState(); + + Card simWC = findCardWithName(simGame, WCname); + + assertEquals(1, simWC.getPowerBonusFromCounters()); + assertEquals(3, simGame.getPlayers().get(0).getCreaturesInPlay().size()); + + } }