Merge branch 'newBranch' into 'master'

Fix Amass ability (Woodland Champion and Dreadhorde Invasion)

See merge request core-developers/forge!2279
This commit is contained in:
Hans Mackowiak
2019-11-12 12:13:36 +00:00
2 changed files with 49 additions and 0 deletions

View File

@@ -8,6 +8,7 @@ import forge.game.card.Card;
import forge.game.card.CardCollectionView; import forge.game.card.CardCollectionView;
import forge.game.card.CardLists; import forge.game.card.CardLists;
import forge.game.card.CardPredicates; import forge.game.card.CardPredicates;
import forge.game.card.CardZoneTable;
import forge.game.card.CounterType; import forge.game.card.CounterType;
import forge.game.card.token.TokenInfo; import forge.game.card.token.TokenInfo;
import forge.game.event.GameEventTokenCreated; 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 int amount = AbilityUtils.calculateAmount(card, sa.getParamOrDefault("Num", "1"), sa);
final boolean remember = sa.hasParam("RememberAmass"); 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 // create army token if needed
if (CardLists.count(activator.getCardsIn(ZoneType.Battlefield), CardPredicates.isType("Army")) == 0) { if (CardLists.count(activator.getCardsIn(ZoneType.Battlefield), CardPredicates.isType("Army")) == 0) {
final String tokenScript = "b_0_0_zombie_army"; 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? // Should this be catching the Card that's returned?
Card c = game.getAction().moveToPlay(tok, sa); Card c = game.getAction().moveToPlay(tok, sa);
if (c.getZone() != null) {
triggerList.put(ZoneType.None, c.getZone().getZoneType(), c);
}
c.updateStateForView(); c.updateStateForView();
} }
if (!useZoneTable) {
triggerList.triggerChangesZoneAll(game);
triggerList.clear();
}
game.fireEvent(new GameEventTokenCreated()); game.fireEvent(new GameEventTokenCreated());
} }

View File

@@ -2093,4 +2093,34 @@ public class GameSimulatorTest extends SimulationTestCase {
assertEquals(1, numForest); assertEquals(1, numForest);
assertEquals(0, simGame.getPlayers().get(1).getCardsIn(ZoneType.Battlefield).size()); 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());
}
} }