From 4fd4fa37b3c765355d671870159cced89ae778cc Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Thu, 20 Jan 2022 23:33:35 +0100 Subject: [PATCH] Fix replaced tokens not gaining additional traits --- .../game/ability/effects/ReplaceTokenEffect.java | 15 +++++++++++---- .../game/ability/effects/TokenEffectBase.java | 1 + 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ReplaceTokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ReplaceTokenEffect.java index 703e6f0f960..a3df62333db 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ReplaceTokenEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ReplaceTokenEffect.java @@ -13,6 +13,7 @@ import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; +import forge.game.card.CardFactory; import forge.game.card.TokenCreateTable; import forge.game.card.token.TokenInfo; import forge.game.player.Player; @@ -81,7 +82,7 @@ public class ReplaceTokenEffect extends SpellAbilityEffect { long timestamp = game.getNextTimestamp(); Map toInsertMap = Maps.newHashMap(); - Map> toRememberMap = Maps.newHashMap(); + Map oldTokenMap = Maps.newHashMap(); Set toRemoveSet = Sets.newHashSet(); for (Map.Entry e : table.row(affected).entrySet()) { if (!sa.matchesValidParam("ValidCard", e.getKey())) { @@ -90,7 +91,7 @@ public class ReplaceTokenEffect extends SpellAbilityEffect { Player controller = e.getKey().getController(); int old = ObjectUtils.defaultIfNull(toInsertMap.get(controller), 0); toInsertMap.put(controller, old + e.getValue()); - toRememberMap.put(controller, e.getKey().getRemembered()); + oldTokenMap.put(controller, e.getKey()); toRemoveSet.add(e.getKey()); } // remove replaced tokens @@ -109,9 +110,15 @@ public class ReplaceTokenEffect extends SpellAbilityEffect { } token.setController(pe.getKey(), timestamp); + + // reapply state to new token + final Card newToken = CardFactory.copyCard(token, true); + newToken.setStates(CardFactory.getCloneStates(token, newToken, (SpellAbility) originalParams.get(AbilityKey.SourceSA))); + // force update the now set State + newToken.setState(newToken.getCurrentStateName(), true, true); // if token is created from ForEach keep that - token.addRemembered(toRememberMap.get(pe.getKey())); - table.put(affected, token, pe.getValue()); + newToken.addRemembered(oldTokenMap.get(pe.getKey()).getRemembered()); + table.put(affected, newToken, pe.getValue()); } } } else if ("ReplaceController".equals(sa.getParam("Type"))) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffectBase.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffectBase.java index afedc7d42be..504dc3acacc 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffectBase.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffectBase.java @@ -84,6 +84,7 @@ public abstract class TokenEffectBase extends SpellAbilityEffect { for (Player p : tokenTable.rowKeySet()) { final Map repParams = AbilityKey.mapFromAffected(p); repParams.put(AbilityKey.Token, tokenTable); + repParams.put(AbilityKey.SourceSA, sa); repParams.put(AbilityKey.EffectOnly, true); // currently only effects can create tokens? switch (game.getReplacementHandler().run(ReplacementType.CreateToken, repParams)) {