From 743163fce779889f69f05a1c02eb9f799368a579 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 16 Apr 2021 12:43:19 +0000 Subject: [PATCH] StackInstance only store direct SVars --- .../main/java/forge/game/CardTraitBase.java | 8 +++++-- .../src/main/java/forge/game/IHasSVars.java | 1 + .../src/main/java/forge/game/card/Card.java | 6 ++++++ .../main/java/forge/game/card/CardState.java | 16 ++++++++++++++ .../forge/game/cost/CostRemoveAnyCounter.java | 4 +--- .../forge/game/cost/CostRemoveCounter.java | 4 +--- .../forge/game/spellability/SpellAbility.java | 21 +++++++------------ .../SpellAbilityStackInstance.java | 2 +- 8 files changed, 39 insertions(+), 23 deletions(-) diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index f0ab86412eb..78d4bacc2b7 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -1,6 +1,5 @@ package forge.game; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -531,11 +530,16 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, @Override public Map getSVars() { - Map res = new HashMap<>(getSVarFallback().getSVars()); + Map res = Maps.newHashMap(getSVarFallback().getSVars()); res.putAll(sVars); 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 f6effefb3f0..255c45ec440 100644 --- a/forge-game/src/main/java/forge/game/IHasSVars.java +++ b/forge-game/src/main/java/forge/game/IHasSVars.java @@ -15,6 +15,7 @@ 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/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 2e590f74a3c..50d0f287809 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1589,10 +1589,16 @@ public class Card extends GameEntity implements Comparable, IHasSVars { currentState.setSVar(var, str); } + @Override public final Map getSVars() { 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 a6988edfa82..a68359f6554 100644 --- a/forge-game/src/main/java/forge/game/card/CardState.java +++ b/forge-game/src/main/java/forge/game/card/CardState.java @@ -480,30 +480,46 @@ public class CardState extends GameObject implements IHasSVars { return null; } + @Override public final Map getSVars() { return sVars; } + + @Override + public Map getDirectSVars() { + return sVars; + } + + @Override public final String getSVar(final String var) { if (sVars.containsKey(var)) { return sVars.get(var); } return ""; } + + @Override public final boolean hasSVar(final String var) { if (var == null) { return false; } return sVars.containsKey(var); } + + @Override public final void setSVar(final String var, final String str) { sVars.put(var, str); view.updateFoilIndex(card.getState(CardStateName.Original)); } + + @Override public final void setSVars(final Map newSVars) { sVars = Maps.newTreeMap(); sVars.putAll(newSVars); view.updateFoilIndex(card.getState(CardStateName.Original)); } + + @Override public final void removeSVar(final String var) { sVars.remove(var); } diff --git a/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java b/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java index 83a94d48073..28725a593ec 100644 --- a/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java @@ -115,8 +115,6 @@ public class CostRemoveAnyCounter extends CostPart { @Override public boolean payAsDecided(Player ai, PaymentDecision decision, SpellAbility ability) { - final Card source = ability.getHostCard(); - int removed = 0; for (Entry> e : decision.counterTable.row(Optional.absent()).entrySet()) { for (Entry v : e.getValue().entrySet()) { @@ -128,7 +126,7 @@ public class CostRemoveAnyCounter extends CostPart { } } - source.setSVar("CostCountersRemoved", Integer.toString(removed)); + ability.setSVar("CostCountersRemoved", Integer.toString(removed)); return true; } diff --git a/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java b/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java index 44ae5425fb4..517d092ca6c 100644 --- a/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java @@ -172,8 +172,6 @@ public class CostRemoveCounter extends CostPart { @Override public boolean payAsDecided(Player ai, PaymentDecision decision, SpellAbility ability) { - Card source = ability.getHostCard(); - int removed = 0; final int toRemove = decision.c; @@ -184,7 +182,7 @@ public class CostRemoveCounter extends CostPart { c.getGame().updateLastStateForCard(c); } - source.setSVar("CostCountersRemoved", Integer.toString(removed)); + ability.setSVar("CostCountersRemoved", Integer.toString(removed)); return 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 145c9fe8413..62bda85d715 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -27,6 +27,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -45,6 +46,7 @@ import forge.game.Game; import forge.game.GameActionUtil; import forge.game.GameEntity; import forge.game.GameObject; +import forge.game.IHasSVars; import forge.game.IIdentifiable; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityKey; @@ -59,7 +61,6 @@ import forge.game.card.CardPredicates; import forge.game.card.CardZoneTable; import forge.game.cost.Cost; import forge.game.cost.CostPart; -import forge.game.cost.CostRemoveCounter; import forge.game.event.GameEventCardStatsChanged; import forge.game.keyword.Keyword; import forge.game.mana.Mana; @@ -1471,6 +1472,10 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit return null; } + protected IHasSVars getSVarFallback() { + return ObjectUtils.firstNonNull(this.getParent(), super.getSVarFallback()); + } + public boolean isUndoable() { return undoable && payCosts.isUndoable() && getHostCard().isInPlay(); } @@ -1664,20 +1669,8 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit if (!isMinTargetChosen()) { return false; } - int maxTargets = getMaxTargets(); - if (maxTargets == 0 && getPayCosts().hasSpecificCostType(CostRemoveCounter.class) - && hasSVar(getParam("TargetMax")) - && getSVar(getParam("TargetMax")).startsWith("Count$CardCounters") - && getHostCard() != null && getHostCard().hasSVar("CostCountersRemoved")) { - // TODO: Current AI implementation removes the counters during payment before the - // ability is added to stack, resulting in maxTargets=0 at this point. We are - // assuming here that the AI logic specified a legal number, and that number ended - // up being in CostCountersRemoved that is created on the card during payment. - maxTargets = Integer.parseInt(getHostCard().getSVar("CostCountersRemoved")); - } - - return maxTargets >= getTargets().size(); + return getMaxTargets() >= getTargets().size(); } /** *

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 ca047eadf30..4ba13945094 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java @@ -132,7 +132,7 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { // We probably should be storing SA svars too right? if (!sa.isWrapper()) { - for (final Entry e : sa.getSVars().entrySet()) { + for (final Entry e : sa.getDirectSVars().entrySet()) { final String value = e.getValue(); if (!StringUtils.isEmpty(value)) { storedSVars.put(e.getKey(), value);