HiddenStaticAbilities: add Statics without the need for Effect objects

This commit is contained in:
Hans Mackowiak
2025-11-15 09:35:47 +01:00
parent c226ec5b1e
commit 8f5276d10d
4 changed files with 33 additions and 25 deletions

View File

@@ -1103,11 +1103,16 @@ public class GameAction {
if (stAb.checkMode(StaticAbilityMode.Continuous) && stAb.zonesCheck()) { if (stAb.checkMode(StaticAbilityMode.Continuous) && stAb.zonesCheck()) {
staticAbilities.add(stAb); staticAbilities.add(stAb);
} }
} }
if (!co.getStaticCommandList().isEmpty()) { if (!co.getStaticCommandList().isEmpty()) {
staticList.add(co); staticList.add(co);
} }
return true; for (StaticAbility stAb : co.getHiddenStaticAbilities()) {
if (stAb.checkMode(StaticAbilityMode.Continuous) && stAb.zonesCheck()) {
staticAbilities.add(stAb);
}
}
return true;
} }
}, true); }, true);

View File

@@ -209,7 +209,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
private boolean renowned; private boolean renowned;
private boolean solved; private boolean solved;
private boolean tributed; private boolean tributed;
private Card suspectedEffect = null; private StaticAbility suspectedStatic = null;
private SpellAbility manifestedSA; private SpellAbility manifestedSA;
private SpellAbility cloakedSA; private SpellAbility cloakedSA;
@@ -6758,15 +6758,15 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
return true; return true;
} }
public Card getSuspectedEffect() { public StaticAbility getSuspectedStatic() {
return this.suspectedEffect; return this.suspectedStatic;
} }
public void setSuspectedEffect(Card effect) { public void setSuspectedStatic(StaticAbility stAb) {
this.suspectedEffect = effect; this.suspectedStatic = stAb;
} }
public final boolean isSuspected() { public final boolean isSuspected() {
return suspectedEffect != null; return suspectedStatic != null;
} }
public final boolean setSuspected(final boolean suspected) { public final boolean setSuspected(final boolean suspected) {
@@ -6779,23 +6779,15 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
return true; return true;
} }
suspectedEffect = SpellAbilityEffect.createEffect(null, this, this.getController(), "Suspected Effect", getImageKey(), getGame().getNextTimestamp()); String s = "Mode$ Continuous | AffectedDefined$ Self | AddKeyword$ Menace | AddStaticAbility$ SuspectedCantBlockBy";
suspectedEffect.setRenderForUI(false); suspectedStatic = StaticAbility.create(s, this, currentState, true);
suspectedEffect.addRemembered(this); suspectedStatic.putParam("Timestamp", String.valueOf(getGame().getNextTimestamp()));
String s = "Mode$ Continuous | AffectedDefined$ RememberedCard | EffectZone$ Command | AddKeyword$ Menace | AddStaticAbility$ SuspectedCantBlockBy";
StaticAbility suspectedStatic = suspectedEffect.addStaticAbility(s);
String effect = "Mode$ CantBlock | ValidCard$ Creature.Self | Description$ CARDNAME can't block."; String effect = "Mode$ CantBlock | ValidCard$ Creature.Self | Description$ CARDNAME can't block.";
suspectedStatic.setSVar("SuspectedCantBlockBy", effect); suspectedStatic.setSVar("SuspectedCantBlockBy", effect);
GameCommand until = SpellAbilityEffect.exileEffectCommand(getGame(), suspectedEffect);
addLeavesPlayCommand(until);
getGame().getAction().moveToCommand(suspectedEffect, null);
} else { } else {
if (isSuspected()) { suspectedStatic = null;
getGame().getAction().exileEffect(suspectedEffect);
suspectedEffect = null;
}
} }
return true; return true;
} }
@@ -7293,6 +7285,15 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
} }
} }
public final FCollectionView<StaticAbility> getHiddenStaticAbilities() {
FCollection<StaticAbility> result = new FCollection<>();
// Suspected
if (this.isInPlay() && this.isSuspected()) {
result.add(suspectedStatic);
}
return result;
}
public final FCollectionView<Trigger> getTriggers() { public final FCollectionView<Trigger> getTriggers() {
return currentState.getTriggers(); return currentState.getTriggers();
} }

View File

@@ -315,7 +315,7 @@ public class CardCopyService {
newCopy.setSaddled(copyFrom.isSaddled()); newCopy.setSaddled(copyFrom.isSaddled());
if (newCopy.isSaddled()) newCopy.setSaddledByThisTurn(copyFrom.getSaddledByThisTurn()); if (newCopy.isSaddled()) newCopy.setSaddledByThisTurn(copyFrom.getSaddledByThisTurn());
if (copyFrom.isSuspected()) { if (copyFrom.isSuspected()) {
newCopy.setSuspectedEffect(getLKICopy(copyFrom.getSuspectedEffect(), cachedMap)); newCopy.setSuspectedStatic(copyFrom.getSuspectedStatic().copy(newCopy, true));
} }
newCopy.setDamageHistory(copyFrom.getDamageHistory()); newCopy.setDamageHistory(copyFrom.getDamageHistory());

View File

@@ -297,7 +297,9 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone
* conditions are fulfilled. * conditions are fulfilled.
*/ */
private boolean shouldApplyContinuousAbility(final StaticAbilityLayer layer, final boolean previousRun) { private boolean shouldApplyContinuousAbility(final StaticAbilityLayer layer, final boolean previousRun) {
return layers.contains(layer) && checkConditions(StaticAbilityMode.Continuous) && (previousRun || getHostCard().getStaticAbilities().contains(this)); return layers.contains(layer) && checkConditions(StaticAbilityMode.Continuous) && ( previousRun ||
getHostCard().getStaticAbilities().contains(this) ||
getHostCard().getHiddenStaticAbilities().contains(this));
} }
public final Cost getAttackCost(final Card attacker, final GameEntity target, final List<Card> attackersWithOptionalCost) { public final Cost getAttackCost(final Card attacker, final GameEntity target, final List<Card> attackersWithOptionalCost) {