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 ee3d7c221e5..68e288926ca 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 @@ -4,6 +4,8 @@ import java.util.Map; import java.util.Set; import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Maps; @@ -82,7 +84,7 @@ public class ReplaceTokenEffect extends SpellAbilityEffect { } else if ("ReplaceToken".equals(sa.getParam("Type"))) { long timestamp = game.getNextTimestamp(); - Multimap>> toInsertMap = ArrayListMultimap.create(); + Multimap>> toInsertMap = ArrayListMultimap.create(); Set toRemoveSet = Sets.newHashSet(); for (Map.Entry e : table.row(affected).entrySet()) { if (!sa.matchesValidParam("ValidCard", e.getKey())) { @@ -91,32 +93,30 @@ public class ReplaceTokenEffect extends SpellAbilityEffect { Player controller = e.getKey().getController(); // TODO should still merge the amounts to avoid additional prototypes when sourceSA doesn't use ForEach //int old = ObjectUtils.defaultIfNull(toInsertMap.get(controller), 0); - Map> tokenAmountMap = Maps.newHashMap(); - tokenAmountMap.put(e.getValue(), e.getKey().getRemembered()); - toInsertMap.put(controller, tokenAmountMap); + Pair> tokenAmountPair = new ImmutablePair<>(e.getValue(), e.getKey().getRemembered()); + toInsertMap.put(controller, tokenAmountPair); toRemoveSet.add(e.getKey()); } // remove replaced tokens table.row(affected).keySet().removeAll(toRemoveSet); // insert new tokens - for (Map.Entry>> pe : toInsertMap.entries()) { - for (Map.Entry> amounts : pe.getValue().entrySet()) { - if (amounts.getKey() <= 0) { - continue; - } - for (String script : sa.getParam("TokenScript").split(",")) { - final Card token = TokenInfo.getProtoType(script, sa, pe.getKey()); + for (Map.Entry>> pe : toInsertMap.entries()) { + int amt = pe.getValue().getLeft(); + if (amt <= 0) { + continue; + } + for (String script : sa.getParam("TokenScript").split(",")) { + final Card token = TokenInfo.getProtoType(script, sa, pe.getKey()); - if (token == null) { - throw new RuntimeException("don't find Token for TokenScript: " + script); - } - - token.setController(pe.getKey(), timestamp); - // if token is created from ForEach keep that - token.addRemembered(amounts.getValue()); - table.put(affected, token, amounts.getKey()); + if (token == null) { + throw new RuntimeException("don't find Token for TokenScript: " + script); } + + token.setController(pe.getKey(), timestamp); + // if token is created from ForEach keep that + token.addRemembered(pe.getValue().getRight()); + table.put(affected, token, amt); } } } else if ("ReplaceController".equals(sa.getParam("Type"))) {