From d64774dba056b25b6340d6ba49ddfe8c1aa140b2 Mon Sep 17 00:00:00 2001 From: Myrd Date: Tue, 27 Dec 2016 17:24:59 +0000 Subject: [PATCH] Fix commander casting which I broke in r32823. Revert to the original implementation of adding the ability to the Game cache in clone(), but now update this in setHostCard() if the new card comes from a different Game object. --- forge-game/src/main/java/forge/game/Game.java | 7 +++++-- .../src/main/java/forge/game/GameEntityCache.java | 4 ++++ forge-game/src/main/java/forge/game/card/Card.java | 3 --- .../java/forge/game/spellability/SpellAbility.java | 14 +++++++++++--- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index d5e248ca76c..6b6c548cf12 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -193,8 +193,11 @@ public class Game { public SpellAbility getSpellAbility(final SpellAbilityView view) { return spabCache.get(view); } - public void addSpellAbility(int id, SpellAbility spellAbility) { - spabCache.put(Integer.valueOf(id), spellAbility); + public void addSpellAbility(SpellAbility spellAbility) { + spabCache.put(spellAbility.getId(), spellAbility); + } + public void removeSpellAbility(SpellAbility spellAbility) { + spabCache.remove(spellAbility.getId()); } public Game(List players0, GameRules rules0, Match match0) { /* no more zones to map here */ diff --git a/forge-game/src/main/java/forge/game/GameEntityCache.java b/forge-game/src/main/java/forge/game/GameEntityCache.java index 0b813732504..182568341cf 100644 --- a/forge-game/src/main/java/forge/game/GameEntityCache.java +++ b/forge-game/src/main/java/forge/game/GameEntityCache.java @@ -13,6 +13,10 @@ public class GameEntityCache { public final void addSpellAbility(final SpellAbility a) { a.setHostCard(this); - if (game != null) { - game.addSpellAbility(a.getId(), a); - } currentState.addSpellAbility(a); currentState.getView().updateAbilityText(this, currentState); } 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 f588a5e2079..1c89044c2b6 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -183,12 +183,12 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } view = view0; if (hostCard != null && hostCard.getGame() != null) { - hostCard.getGame().addSpellAbility(id, this); + hostCard.getGame().addSpellAbility(this); } } @Override - public int getId() { + public final int getId() { return id; } @Override @@ -204,6 +204,12 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit public void setHostCard(final Card c) { if (hostCard == c) { return; } super.setHostCard(c); + Game oldGame = hostCard != null ? hostCard.getGame() : null; + Game newGame = c != null ? c.getGame() : null; + if (oldGame != newGame) { + if (oldGame != null) { oldGame.removeSpellAbility(this); } + if (newGame != null) { newGame.addSpellAbility(this); } + } if (subAbility != null) { subAbility.setHostCard(c); @@ -760,7 +766,9 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit clone = (SpellAbility) clone(); clone.id = nextId(); clone.view = new SpellAbilityView(clone); - + if (hostCard != null && hostCard.getGame() != null) { + hostCard.getGame().addSpellAbility(clone); + } // need to clone the maps too so they can be changed clone.originalMapParams = Maps.newHashMap(this.originalMapParams); clone.mapParams = Maps.newHashMap(this.mapParams);