diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index da88f31f75a..76dc0a1e2ee 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -607,7 +607,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, } @Override - public final void setSVar(final String name, final String value) { + public void setSVar(final String name, final String value) { sVars.put(name, value); } @@ -622,11 +622,6 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, return res; } - @Override - public Map getDirectSVars() { - return sVars; - } - @Override public void setSVars(Map newSVars) { sVars = Maps.newTreeMap(); diff --git a/forge-game/src/main/java/forge/game/IHasSVars.java b/forge-game/src/main/java/forge/game/IHasSVars.java index 255c45ec440..f6effefb3f0 100644 --- a/forge-game/src/main/java/forge/game/IHasSVars.java +++ b/forge-game/src/main/java/forge/game/IHasSVars.java @@ -15,7 +15,6 @@ public interface IHasSVars { //public Set getSVars(); public Map getSVars(); - public Map getDirectSVars(); public void removeSVar(final String var); } diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index e325070bff7..d04d67be5a0 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1786,11 +1786,10 @@ public class AbilityUtils { } // Count$NumTimesChoseMode if (sq[0].startsWith("NumTimesChoseMode")) { - SpellAbility sub = sa.getRootAbility(); int amount = 0; - while (sub != null) { - if (sub.getDirectSVars().containsKey("CharmOrder")) amount++; - sub = sub.getSubAbility(); + SpellAbility tail = sa.getTailAbility(); + if (tail.hasSVar("CharmOrder")) { + amount = tail.getSVarInt("CharmOrder"); } return doXMath(amount, expr, c, ctb); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java index 59db137aa37..624c8a5d528 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java @@ -45,7 +45,7 @@ public class CharmEffect extends SpellAbilityEffect { choices.removeAll(toRemove); } - int indx = 0; + int indx = 1; // set CharmOrder for (AbilitySub sub : choices) { sub.setSVar("CharmOrder", Integer.toString(indx)); 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 49ea1f44a23..d9c4484b15d 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2017,11 +2017,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr return currentState.getSVars(); } - @Override - public Map getDirectSVars() { - return ImmutableMap.of(); - } - public final void setSVars(final Map newSVars) { currentState.setSVars(newSVars); } 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 966960f8269..3782eb72c89 100644 --- a/forge-game/src/main/java/forge/game/card/CardState.java +++ b/forge-game/src/main/java/forge/game/card/CardState.java @@ -569,11 +569,6 @@ public class CardState extends GameObject implements IHasSVars, ITranslatable { return sVars; } - @Override - public Map getDirectSVars() { - return sVars; - } - @Override public final String getSVar(final String var) { if (sVars.containsKey(var)) { diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index 71b4fc3acb5..2493767ed87 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -128,14 +128,10 @@ public class CostAdjustment { } else if (st.hasParam("Amount")) { String amount = st.getParam("Amount"); if ("Escalate".equals(amount)) { - SpellAbility sub = sa; - while (sub != null) { - if (sub.getDirectSVars().containsKey("CharmOrder")) { - count++; - } - sub = sub.getSubAbility(); + SpellAbility tail = sa.getTailAbility(); + if (tail.hasSVar("CharmOrder")) { + count = tail.getSVarInt("CharmOrder") - 1; } - --count; } else if ("Strive".equals(amount)) { for (TargetChoices tc : sa.getAllTargetChoices()) { count += tc.size(); 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 c77aba6b215..23e476e30d9 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java @@ -410,11 +410,6 @@ public abstract class KeywordInstance> implements K return getSVarFallback().getSVars(); } - @Override - public Map getDirectSVars() { - return null; - } - @Override public void setSVars(Map newSVars) { } 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 be7a06be4db..28351337b46 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -1180,11 +1180,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit view.updateDescription(this); } public void appendSubAbility(final AbilitySub toAdd) { - SpellAbility tailend = this; - while (tailend.getSubAbility() != null) { - tailend = tailend.getSubAbility(); - } - tailend.setSubAbility(toAdd); + getTailAbility().setSubAbility(toAdd); } public boolean isBasicSpell() { @@ -1642,6 +1638,13 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } return parent; } + public SpellAbility getTailAbility() { + SpellAbility tailend = this; + while (tailend.getSubAbility() != null) { + tailend = tailend.getSubAbility(); + } + return tailend; + } public SpellAbility getParent() { return null; diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java index 7f99264cf55..c324fe367e9 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java @@ -31,7 +31,6 @@ import forge.game.card.CardView; import forge.game.card.IHasCardView; import forge.game.player.Player; import forge.game.trigger.TriggerType; -import forge.game.trigger.WrappedAbility; import forge.util.TextUtil; /** @@ -75,10 +74,9 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { subInstance = ability.getSubAbility() == null ? null : new SpellAbilityStackInstance(ability.getSubAbility()); - final Map sVars = (ability.isWrapper() ? ((WrappedAbility) ability).getWrappedAbility() : ability).getDirectSVars(); - if (ApiType.SetState == sa.getApi() && !sVars.containsKey("StoredTransform")) { + if (ApiType.SetState == sa.getApi() && !ability.hasSVar("StoredTransform")) { // Record current state of Transformation if the ability might change state - sVars.put("StoredTransform", String.valueOf(ability.getHostCard().getTransformedTimestamp())); + ability.setSVar("StoredTransform", String.valueOf(ability.getHostCard().getTransformedTimestamp())); } if (sa.getApi() == ApiType.Charm && sa.hasParam("ChoiceRestriction")) { diff --git a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java index 8d598d2bcb7..78b3a22d57a 100644 --- a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java +++ b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java @@ -296,6 +296,11 @@ public class WrappedAbility extends Ability { return sa.getSVarInt(name); } + @Override + public void setSVar(final String name, final String value) { + sa.setSVar(name, value); + } + @Override public Map getSVars() { return sa.getSVars();