diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java index 6601793a66f..350369cefd8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java @@ -185,6 +185,13 @@ public class TokenEffect extends SpellAbilityEffect { final Card host = sa.getHostCard(); final SpellAbility root = sa.getRootAbility(); readParameters(sa); + + // Cause of the Token Effect, in general it should be this + // but if its a Replacement Effect, it might be something else or null + SpellAbility cause = sa; + if (root.isReplacementAbility() && root.hasReplacingObject("Cause")) { + cause = (SpellAbility)root.getReplacingObject("Cause"); + } String cost = ""; @@ -266,7 +273,7 @@ public class TokenEffect extends SpellAbilityEffect { final String imageName = imageNames.get(MyRandom.getRandom().nextInt(imageNames.size())); final CardFactory.TokenInfo tokenInfo = new CardFactory.TokenInfo(substitutedName, imageName, cost, substitutedTypes, this.tokenKeywords, finalPower, finalToughness); - final List tokens = CardFactory.makeToken(tokenInfo, controller); + final List tokens = CardFactory.makeToken(tokenInfo, controller, cause != null); // Grant rule changes if (this.tokenHiddenKeywords != null) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 27606eb7278..7945c312d83 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -796,10 +796,6 @@ public class CardFactory { return new TokenInfo(tokenInfo[0], imageName, manaCost, types, keywords, power, toughness); } } - - public static List makeToken(final TokenInfo tokenInfo, final Player controller) { - return makeToken(tokenInfo, controller, true); - } public static List makeToken(final TokenInfo tokenInfo, final Player controller, final boolean applyMultiplier) { final List list = Lists.newArrayList(); 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 a5a5f7127f0..2e76db7e38d 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 @@ -1300,8 +1300,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertNotNull(fatalPushSA); fatalPushSA.setTargetCard(goblin); - // Electrify: should only generate 1 token (FIXME: Forge currently generates 2 tokens!) - // (check http://magicjudge.tumblr.com/post/160491073029/weird-card-interaction-alert-kalitas-anointed ) + // Electrify: should only generate 1 token Card electrify = addCardToZone("Electrify", p, ZoneType.Hand); SpellAbility electrifySA = electrify.getFirstSpellAbility(); assertNotNull(electrifySA); @@ -1314,9 +1313,6 @@ public class GameSimulatorTest extends SimulationTestCase { score = sim.simulateSpellAbility(electrifySA).value; assertTrue(score > 0); - // TODO: this will currently fail because Forge does not implement this interaction correctly, - // generating two tokens instead of one after Electrify. - // Please fix and then enable the assertion line below to ensure it stays properly implemented. - //assertTrue(countCardsWithName(sim.getSimulatedGameState(), "Zombie") == 3); + assertTrue(countCardsWithName(sim.getSimulatedGameState(), "Zombie") == 3); } }