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 6a7f9726588..6de0ac1565e 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -20,6 +20,7 @@ package forge.game.card; import com.esotericsoftware.minlog.Log; import com.google.common.base.Predicates; import com.google.common.collect.*; + import forge.GameCommand; import forge.StaticData; import forge.card.*; @@ -4587,6 +4588,17 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } } + public Table getStoredKeywords() { + return storedKeywords; + } + + public void setStoredKeywords(Table table, boolean lki) { + storedKeywords.clear(); + for (Table.Cell c : table.cellSet()) { + storedKeywords.put(c.getRowKey(), c.getColumnKey(), c.getValue().copy(this, lki)); + } + } + public final void addChangedCardKeywordsByText(final List keywords, final long timestamp, final long staticId, final boolean updateView) { // keywords should already created for Card, so no addKeywordsToCard // this one is done for Volrath's Shapeshifter which replaces all the card text diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 6b266177464..9fde3bf9fe3 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -293,6 +293,8 @@ public final class CardUtil { newCopy.setChangedCardNames(in.getChangedCardNames()); newCopy.setChangedCardTraits(in.getChangedCardTraits()); + newCopy.setStoredKeywords(in.getStoredKeywords(), true); + newCopy.copyChangedTextFrom(in); newCopy.setTimestamp(in.getTimestamp()); diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java b/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java index a5a1aefce5b..76a52eeae8e 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java @@ -31,7 +31,6 @@ import org.apache.commons.lang3.StringUtils; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import com.google.common.collect.Table; import forge.game.CardTraitBase; import forge.game.Game; @@ -48,10 +47,7 @@ import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardDamageMap; import forge.game.card.CardState; -import forge.game.card.CardTraitChanges; import forge.game.card.CardUtil; -import forge.game.keyword.KeywordInterface; -import forge.game.keyword.KeywordsChange; import forge.game.player.Player; import forge.game.player.PlayerCollection; import forge.game.spellability.AbilitySub; @@ -110,53 +106,6 @@ public class ReplacementHandler { game.getAction().checkStaticAbilities(false, Sets.newHashSet(affectedLKI), preList); checkAgain = true; - // need to check if Intrinsic has run - for (ReplacementEffect re : affectedLKI.getReplacementEffects()) { - if (re.isIntrinsic() && this.hasRun.contains(re)) { - re.setHasRun(true); - } - } - - // need to check non Intrinsic - for (Table.Cell e : affectedLKI.getChangedCardTraits().cellSet()) { - boolean hasRunRE = false; - String skey = String.valueOf(e.getRowKey()) + ":" + String.valueOf(e.getColumnKey()); - - for (ReplacementEffect re : this.hasRun) { - if (!re.isIntrinsic() && skey.equals(re.getSVar("_ReplacedTimestamp"))) { - hasRunRE = true; - break; - } - } - - for (ReplacementEffect re : e.getValue().getReplacements()) { - re.setSVar("_ReplacedTimestamp", skey); - if (hasRunRE) { - re.setHasRun(true); - } - } - } - for (Table.Cell e : affectedLKI.getChangedCardKeywords().cellSet()) { - boolean hasRunRE = false; - String skey = String.valueOf(e.getRowKey()) + ":" + String.valueOf(e.getColumnKey()); - - for (ReplacementEffect re : this.hasRun) { - if (!re.isIntrinsic() && skey.equals(re.getSVar("_ReplacedTimestamp"))) { - hasRunRE = true; - break; - } - } - - for (KeywordInterface k : e.getValue().getKeywords()) { - for (ReplacementEffect re : k.getReplacements()) { - re.setSVar("_ReplacedTimestamp", skey); - if (hasRunRE) { - re.setHasRun(true); - } - } - } - } - runParams.put(AbilityKey.Affected, affectedLKI); } @@ -222,6 +171,8 @@ public class ReplacementHandler { for (final ReplacementEffect re : affectedLKI.getReplacementEffects()) { re.setHostCard(affectedCard); } + // need to copy stored keywords from lki into real object to prevent the replacement effect from making new ones + affectedCard.setStoredKeywords(affectedLKI.getStoredKeywords(), true); runParams.put(AbilityKey.Affected, affectedCard); runParams.put(AbilityKey.NewCard, CardUtil.getLKICopy(affectedLKI)); }