From 2c1ef7bbe1d32b29411c5fda18afb5d28cce940c Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 30 Oct 2016 11:33:01 +0000 Subject: [PATCH] SpellAbility: clone now makes a DeepCopy of the SubAbilities too GameActionUtil: no need to copy the Subabilities extra and use appendSubAbility CardFactory: no need to copy --- .../main/java/forge/game/GameActionUtil.java | 19 +++---------------- .../java/forge/game/card/CardFactory.java | 14 ++++---------- .../forge/game/spellability/SpellAbility.java | 10 ++++++++++ 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index c5fe90c6efe..f9f9d331cae 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -404,25 +404,12 @@ public final class GameActionUtil { newSA.setDescription(newSA.getDescription() + " (Splicing " + c + " onto it)"); newSA.addSplicedCards(c); - // copy all subAbilities - SpellAbility child = newSA; - while (child.getSubAbility() != null) { - AbilitySub newChild = child.getSubAbility().getCopy(); - child.setSubAbility(newChild); - child.setActivatingPlayer(newSA.getActivatingPlayer()); - child = newChild; - } + newSA.setActivatingPlayer(sa.getActivatingPlayer()); + newSA.setHostCard(source); //add the spliced ability to the end of the chain - child.setSubAbility(subAbility); + newSA.appendSubAbility(subAbility); - //set correct source and activating player to all the spliced abilities - child = subAbility; - while (child != null) { - child.setHostCard(source); - child.setActivatingPlayer(newSA.getActivatingPlayer()); - child = child.getSubAbility(); - } newSAs.add(newSA); allSaCombinations.add(++i, newSA); } diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 5927cf357eb..eea66582f4e 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -204,18 +204,12 @@ public class CardFactory { } else { copySA = sa.copy(); - copySA.setHostCard(c); - SpellAbility parentSA = copySA; - SpellAbility subSA = copySA.getSubAbility(); + AbilitySub subSA = copySA.getSubAbility(); while (subSA != null) { - AbilitySub copySubSA = ((AbilitySub) subSA).getCopy(); - parentSA.setSubAbility(copySubSA); - copySubSA.setParent(parentSA); - copySubSA.setHostCard(c); - copySubSA.setCopied(true); - parentSA = copySubSA; - subSA = copySubSA.getSubAbility(); + subSA.setCopied(true); + subSA = subSA.getSubAbility(); } + copySA.setHostCard(c); } c.getCurrentState().setNonManaAbilities(copySA); copySA.setCopied(true); diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 687c2ca5224..45f04607be5 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -32,6 +32,7 @@ import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; +import forge.game.card.CardFactory; import forge.game.cost.Cost; import forge.game.cost.CostPart; import forge.game.cost.CostPartMana; @@ -197,6 +198,11 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit public void setHostCard(final Card c) { if (hostCard == c) { return; } super.setHostCard(c); + + if (subAbility != null) { + subAbility.setHostCard(c); + } + view.updateHostCard(this); view.updateDescription(this); //description can change if host card does } @@ -664,9 +670,13 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit if (clone.hostCard != null && clone.hostCard.getGame() != null) { clone.hostCard.getGame().addSpellAbility(clone.id, clone); } + // need to clone the maps too so they can be changed clone.originalMapParams = Maps.newHashMap(this.originalMapParams); clone.mapParams = Maps.newHashMap(this.mapParams); + + // run special copy Ability to make a deep copy + CardFactory.copySpellAbility(this, clone); } catch (final CloneNotSupportedException e) { System.err.println(e); }