diff --git a/forge-game/src/main/java/forge/game/card/CardState.java b/forge-game/src/main/java/forge/game/card/CardState.java index 558cdfabca1..631f449ee9b 100644 --- a/forge-game/src/main/java/forge/game/card/CardState.java +++ b/forge-game/src/main/java/forge/game/card/CardState.java @@ -159,7 +159,7 @@ public class CardState extends GameObject { public final void setIntrinsicKeywords(final Iterable intrinsicKeyword0) { intrinsicKeywords.clear(); for (KeywordInterface k : intrinsicKeyword0) { - intrinsicKeywords.insert(k.copy()); + intrinsicKeywords.insert(k.copy(card)); } } @@ -371,28 +371,41 @@ public class CardState extends GameObject { setBaseToughness(source.getBaseToughness()); setSVars(source.getSVars()); - this.manaAbilities.clear(); + manaAbilities.clear(); for (SpellAbility sa : source.manaAbilities) { - this.manaAbilities.add(sa.copy()); + SpellAbility saCopy = sa.copy(); + saCopy.setHostCard(card); // update HostCard + manaAbilities.add(saCopy); } - this.nonManaAbilities.clear(); + nonManaAbilities.clear(); for (SpellAbility sa : source.nonManaAbilities) { - this.nonManaAbilities.add(sa.copy()); + SpellAbility saCopy = sa.copy(); + saCopy.setHostCard(card); // update HostCard + nonManaAbilities.add(saCopy); } setIntrinsicKeywords(source.intrinsicKeywords.getValues()); setImageKey(source.getImageKey()); setRarity(source.rarity); setSetCode(source.setCode); - replacementEffects.clear(); - for (ReplacementEffect RE : source.replacementEffects) { - replacementEffects.add(RE.getCopy()); + + triggers.clear(); + for (Trigger tr : source.triggers) { + triggers.add(tr.getCopyForHostCard(card)); } - this.staticAbilities.clear(); + + replacementEffects.clear(); + for (ReplacementEffect re : source.replacementEffects) { + ReplacementEffect reCopy = re.getCopy(); + reCopy.setHostCard(card); + replacementEffects.add(reCopy); + } + + staticAbilities.clear(); for (StaticAbility sa : source.staticAbilities) { StaticAbility saCopy = new StaticAbility(sa, this.card); - this.staticAbilities.add(saCopy); + staticAbilities.add(saCopy); } view.updateKeywords(c, this); } @@ -430,7 +443,10 @@ public class CardState extends GameObject { public List addIntrinsicKeywords(Collection intrinsicKeywords2) { List names = Lists.newArrayList(); for (KeywordInterface inst : intrinsicKeywords2) { - names.add(inst.getOriginal()); + String o = inst.getOriginal(); + if (addIntrinsicKeyword(o, false) != null) { + names.add(o); + } } return names; } diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java b/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java index 54b04187b8e..e31e720046c 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java @@ -180,28 +180,32 @@ public abstract class KeywordInstance> implements K * (non-Javadoc) * @see forge.game.keyword.KeywordInterface#copy() */ - public KeywordInterface copy() { + public KeywordInterface copy(final Card host) { try { KeywordInstance result = (KeywordInstance) super.clone(); result.abilities = Lists.newArrayList(); for (SpellAbility sa : this.abilities) { - result.abilities.add(sa.copy()); + SpellAbility saCopy = sa.copy(); + saCopy.setHostCard(host); + result.abilities.add(saCopy); } result.triggers = Lists.newArrayList(); for (Trigger tr : this.triggers) { - result.triggers.add(tr.getCopyForHostCard(tr.getHostCard())); + result.triggers.add(tr.getCopyForHostCard(host)); } result.replacements = Lists.newArrayList(); for (ReplacementEffect re : this.replacements) { - result.replacements.add(re.getCopy()); + ReplacementEffect reCopy = re.getCopy(); + reCopy.setHostCard(host); + result.replacements.add(reCopy); } result.staticAbilities = Lists.newArrayList(); for (StaticAbility sa : this.staticAbilities) { - result.staticAbilities.add(new StaticAbility(sa, sa.getHostCard())); + result.staticAbilities.add(new StaticAbility(sa, host)); } return result; diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java b/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java index 75664a54913..a25de537e09 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java @@ -49,5 +49,5 @@ public interface KeywordInterface extends Cloneable { */ public Collection getStaticAbilities(); - public KeywordInterface copy(); + public KeywordInterface copy(final Card host); } \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index 36bbc5639cd..3beb859c279 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -513,11 +513,15 @@ public abstract class Trigger extends TriggerReplacementBase { SpellAbility old = this.getOverridingAbility(); SpellAbility sa = old; // try to copy it if newHost is not the wanted host - if (!newHost.equals(old.getHostCard())) { - if (old instanceof AbilitySub) { - sa = ((AbilitySub)old).getCopy(); - sa.setHostCard(newHost); - } + final Card oldHost = old.getHostCard(); + if (!newHost.equals(oldHost)) { + if (old instanceof AbilitySub) { + sa = ((AbilitySub)old).getCopy(); + sa.setHostCard(newHost); + } + } else if (newHost != oldHost) { + //host would be the same, but different state? + sa.setHostCard(newHost); } copy.setOverridingAbility(sa); }