diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java index ab694cead5a..3a1ca3596ef 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java @@ -28,6 +28,7 @@ import forge.game.spellability.AbilityActivated; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityRestriction; import forge.game.spellability.SpellAbilityStackInstance; +import forge.game.staticability.StaticAbility; import forge.game.trigger.TriggerType; import forge.game.zone.PlayerZoneBattlefield; import forge.game.zone.ZoneType; @@ -188,14 +189,13 @@ public class GameCopier { private static final boolean USE_FROM_PAPER_CARD = true; private Card createCardCopy(Game newGame, Player newOwner, Card c) { - if (c.isToken()) { + if (c.isToken() && !c.isEmblem()) { String tokenStr = new CardFactory.TokenInfo(c).toString(); // TODO: Use a version of the API that doesn't return a list (i.e. these shouldn't be affected // by doubling season, etc). return CardFactory.makeToken(CardFactory.TokenInfo.fromString(tokenStr), newOwner).get(0); } - - if (USE_FROM_PAPER_CARD) { + if (USE_FROM_PAPER_CARD && !c.isEmblem()) { return Card.fromPaperCard(c.getPaperCard(), newOwner); } @@ -209,6 +209,9 @@ public class GameCopier { for (String type : c.getType()) { newCard.addType(type); } + for (StaticAbility stAb : c.getStaticAbilities()) { + newCard.addStaticAbilityCopy(stAb); + } for (SpellAbility sa : c.getSpellAbilities()) { SpellAbility saCopy; diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 0d54934bfcf..1a1c39854ba 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -3457,6 +3457,11 @@ public class Card extends GameEntity implements Comparable { } return null; } + public final StaticAbility addStaticAbilityCopy(final StaticAbility stAb) { + final StaticAbility stAbCopy = new StaticAbility(stAb, this); + currentState.addStaticAbility(stAbCopy); + return stAbCopy; + } public final void removeStaticAbility(StaticAbility stAb) { currentState.removeStaticAbility(stAb); } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index ee7fd4a84c4..822dc967093 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -215,6 +215,13 @@ public class StaticAbility extends CardTraitBase implements Comparable abilities = ComputerUtilAbility.getSpellAbilities(cards, p); + SpellAbility minusFour = findSAWithPrefix(abilities, "-4: You get an emblem"); + assertNotNull(minusFour); + minusFour.setActivatingPlayer(p); + assertTrue(minusFour.canPlay()); + + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(minusFour); + Game simGame = sim.getSimulatedGameState(); + Card simBear = findCardWithName(simGame, bearCardName); + assertEquals(3, simBear.getNetPower()); + + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Card copyBear = findCardWithName(copy, bearCardName); + assertEquals(3, copyBear.getNetPower()); + } + public void testManifest() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1);