Svar fallback changes (#7385)

* getSVarFallback use stream filter to find one with name
This commit is contained in:
Hans Mackowiak
2025-04-12 10:44:19 +02:00
committed by GitHub
parent e2e3c658a0
commit e7d8664386
3 changed files with 31 additions and 11 deletions

View File

@@ -2,12 +2,14 @@ package forge.game;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Lists;
import forge.card.CardStateName; import forge.card.CardStateName;
import forge.card.MagicColor; import forge.card.MagicColor;
@@ -564,13 +566,20 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView,
return CardView.get(hostCard); return CardView.get(hostCard);
} }
protected IHasSVars getSVarFallback() { protected List<IHasSVars> getSVarFallback() {
List<IHasSVars> result = Lists.newArrayList();
if (this.getKeyword() != null && this.getKeyword().getStatic() != null) { 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) if (getCardState() != null)
return getCardState(); result.add(getCardState());
return getHostCard(); result.add(getHostCard());
return result;
}
protected Optional<IHasSVars> findSVar(final String name) {
return getSVarFallback().stream().filter(f -> f.hasSVar(name)).findFirst();
} }
@Override @Override
@@ -578,12 +587,12 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView,
if (sVars.containsKey(name)) { if (sVars.containsKey(name)) {
return sVars.get(name); return sVars.get(name);
} }
return getSVarFallback().getSVar(name); return findSVar(name).map(o -> o.getSVar(name)).orElse("");
} }
@Override @Override
public boolean hasSVar(final String name) { 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) { public Integer getSVarInt(final String name) {
@@ -604,7 +613,11 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView,
@Override @Override
public Map<String, String> getSVars() { public Map<String, String> getSVars() {
Map<String, String> res = Maps.newHashMap(getSVarFallback().getSVars()); Map<String, String> res = Maps.newHashMap();
// TODO reverse the order
for (IHasSVars s : getSVarFallback()) {
res.putAll(s.getSVars());
}
res.putAll(sVars); res.putAll(sVars);
return res; return res;
} }

View File

@@ -18,6 +18,8 @@
package forge.game.spellability; package forge.game.spellability;
import java.util.Map; import java.util.Map;
import java.util.List;
import com.google.common.collect.Lists;
import forge.game.IHasSVars; import forge.game.IHasSVars;
import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityFactory;
@@ -105,10 +107,10 @@ public final class AbilitySub extends SpellAbility implements java.io.Serializab
} }
@Override @Override
protected IHasSVars getSVarFallback() { protected List<IHasSVars> getSVarFallback() {
// fused or spliced // fused or spliced
if (getRootAbility().getCardState() != getCardState()) { if (getRootAbility().getCardState() != getCardState()) {
return getCardState(); return Lists.newArrayList(getCardState());
} }
return super.getSVarFallback(); return super.getSVarFallback();
} }

View File

@@ -1647,8 +1647,13 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
return null; return null;
} }
protected IHasSVars getSVarFallback() { protected List<IHasSVars> getSVarFallback() {
return ObjectUtils.firstNonNull(this.getParent(), super.getSVarFallback()); List<IHasSVars> result = Lists.newArrayList();
if (getParent() != null) {
result.add(getParent());
}
result.addAll(super.getSVarFallback());
return result;
} }
public boolean isUndoable() { public boolean isUndoable() {