From 63e6733e61e39c789245490e13b38cd6942e19d9 Mon Sep 17 00:00:00 2001 From: elcnesh Date: Wed, 9 Jul 2014 13:03:14 +0000 Subject: [PATCH] Fix copying replacement effects by copying the override ability rather than just the reference. --- .../game/replacement/ReplacementEffect.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java b/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java index ea66c34b413..84390282669 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java @@ -19,8 +19,10 @@ package forge.game.replacement; import forge.game.Game; import forge.game.TriggerReplacementBase; +import forge.game.ability.AbilityApiBased; import forge.game.card.Card; import forge.game.phase.PhaseType; +import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import java.util.List; @@ -135,14 +137,29 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { * @return the copy */ public final ReplacementEffect getCopy() { - ReplacementType rt = ReplacementType.getTypeFor(this); - ReplacementEffect res = rt.createReplacement(mapParams, hostCard, intrinsic); - res.setOverridingAbility(this.getOverridingAbility()); + final ReplacementType rt = ReplacementType.getTypeFor(this); + final ReplacementEffect res = rt.createReplacement(mapParams, hostCard, intrinsic); + final SpellAbility overridingAbility = this.getOverridingAbility(); + if (overridingAbility != null) { + final SpellAbility overridingAbilityCopy; + if (overridingAbility instanceof AbilityApiBased) { + overridingAbilityCopy = ((AbilityApiBased) overridingAbility).getCopy(); + } else if (overridingAbility instanceof AbilitySub) { + overridingAbilityCopy = ((AbilitySub) overridingAbility).getCopy(); + } else { + System.err.println("Overriding ability of " + hostCard + " of unexpected type " + overridingAbility.getClass()); + overridingAbilityCopy = null; + } + + if (overridingAbilityCopy != null) { + overridingAbilityCopy.setHostCard(hostCard); + res.setOverridingAbility(overridingAbilityCopy); + } + } res.setActiveZone(validHostZones); res.setLayer(getLayer()); res.setTemporary(isTemporary()); return res; - } /**