From e7d8664386d23e6673a2340c918e5e682d740cb0 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sat, 12 Apr 2025 10:44:19 +0200 Subject: [PATCH] Svar fallback changes (#7385) * getSVarFallback use stream filter to find one with name --- .../main/java/forge/game/CardTraitBase.java | 27 ++++++++++++++----- .../forge/game/spellability/AbilitySub.java | 6 +++-- .../forge/game/spellability/SpellAbility.java | 9 +++++-- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index 4713d24c8ef..da88f31f75a 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -2,12 +2,14 @@ package forge.game; import java.util.List; import java.util.Map; +import java.util.Optional; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; +import com.google.common.collect.Lists; import forge.card.CardStateName; import forge.card.MagicColor; @@ -564,13 +566,20 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, return CardView.get(hostCard); } - protected IHasSVars getSVarFallback() { + protected List getSVarFallback() { + List result = Lists.newArrayList(); + if (this.getKeyword() != null && this.getKeyword().getStatic() != null) { - return this.getKeyword().getStatic(); + // TODO try to add the keyword instead if possible? + result.add(this.getKeyword().getStatic()); } if (getCardState() != null) - return getCardState(); - return getHostCard(); + result.add(getCardState()); + result.add(getHostCard()); + return result; + } + protected Optional findSVar(final String name) { + return getSVarFallback().stream().filter(f -> f.hasSVar(name)).findFirst(); } @Override @@ -578,12 +587,12 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, if (sVars.containsKey(name)) { return sVars.get(name); } - return getSVarFallback().getSVar(name); + return findSVar(name).map(o -> o.getSVar(name)).orElse(""); } @Override public boolean hasSVar(final String name) { - return sVars.containsKey(name) || getSVarFallback().hasSVar(name); + return sVars.containsKey(name) || findSVar(name).isPresent(); } public Integer getSVarInt(final String name) { @@ -604,7 +613,11 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, @Override public Map getSVars() { - Map res = Maps.newHashMap(getSVarFallback().getSVars()); + Map res = Maps.newHashMap(); + // TODO reverse the order + for (IHasSVars s : getSVarFallback()) { + res.putAll(s.getSVars()); + } res.putAll(sVars); return res; } diff --git a/forge-game/src/main/java/forge/game/spellability/AbilitySub.java b/forge-game/src/main/java/forge/game/spellability/AbilitySub.java index 8784541995d..d4bc0b92f6e 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilitySub.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilitySub.java @@ -18,6 +18,8 @@ package forge.game.spellability; import java.util.Map; +import java.util.List; +import com.google.common.collect.Lists; import forge.game.IHasSVars; import forge.game.ability.AbilityFactory; @@ -105,10 +107,10 @@ public final class AbilitySub extends SpellAbility implements java.io.Serializab } @Override - protected IHasSVars getSVarFallback() { + protected List getSVarFallback() { // fused or spliced if (getRootAbility().getCardState() != getCardState()) { - return getCardState(); + return Lists.newArrayList(getCardState()); } return super.getSVarFallback(); } 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 b333c3dcdf7..be7a06be4db 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -1647,8 +1647,13 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit return null; } - protected IHasSVars getSVarFallback() { - return ObjectUtils.firstNonNull(this.getParent(), super.getSVarFallback()); + protected List getSVarFallback() { + List result = Lists.newArrayList(); + if (getParent() != null) { + result.add(getParent()); + } + result.addAll(super.getSVarFallback()); + return result; } public boolean isUndoable() {