diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 7957d5962d1..5c559ca8947 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -1103,11 +1103,16 @@ public class GameAction { if (stAb.checkMode(StaticAbilityMode.Continuous) && stAb.zonesCheck()) { staticAbilities.add(stAb); } - } - if (!co.getStaticCommandList().isEmpty()) { - staticList.add(co); - } - return true; + } + if (!co.getStaticCommandList().isEmpty()) { + staticList.add(co); + } + for (StaticAbility stAb : co.getHiddenStaticAbilities()) { + if (stAb.checkMode(StaticAbilityMode.Continuous) && stAb.zonesCheck()) { + staticAbilities.add(stAb); + } + } + return true; } }, true); 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 da2e2c153a4..cbfb20f2365 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -209,7 +209,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr private boolean renowned; private boolean solved; private boolean tributed; - private Card suspectedEffect = null; + private StaticAbility suspectedStatic = null; private SpellAbility manifestedSA; private SpellAbility cloakedSA; @@ -6758,15 +6758,15 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr return true; } - public Card getSuspectedEffect() { - return this.suspectedEffect; + public StaticAbility getSuspectedStatic() { + return this.suspectedStatic; } - public void setSuspectedEffect(Card effect) { - this.suspectedEffect = effect; + public void setSuspectedStatic(StaticAbility stAb) { + this.suspectedStatic = stAb; } public final boolean isSuspected() { - return suspectedEffect != null; + return suspectedStatic != null; } public final boolean setSuspected(final boolean suspected) { @@ -6779,23 +6779,15 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr return true; } - suspectedEffect = SpellAbilityEffect.createEffect(null, this, this.getController(), "Suspected Effect", getImageKey(), getGame().getNextTimestamp()); - suspectedEffect.setRenderForUI(false); - suspectedEffect.addRemembered(this); + String s = "Mode$ Continuous | AffectedDefined$ Self | AddKeyword$ Menace | AddStaticAbility$ SuspectedCantBlockBy"; + suspectedStatic = StaticAbility.create(s, this, currentState, true); + 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."; suspectedStatic.setSVar("SuspectedCantBlockBy", effect); - GameCommand until = SpellAbilityEffect.exileEffectCommand(getGame(), suspectedEffect); - addLeavesPlayCommand(until); - getGame().getAction().moveToCommand(suspectedEffect, null); } else { - if (isSuspected()) { - getGame().getAction().exileEffect(suspectedEffect); - suspectedEffect = null; - } + suspectedStatic = null; } return true; } @@ -7293,6 +7285,15 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr } } + public final FCollectionView getHiddenStaticAbilities() { + FCollection result = new FCollection<>(); + // Suspected + if (this.isInPlay() && this.isSuspected()) { + result.add(suspectedStatic); + } + return result; + } + public final FCollectionView getTriggers() { return currentState.getTriggers(); } diff --git a/forge-game/src/main/java/forge/game/card/CardCopyService.java b/forge-game/src/main/java/forge/game/card/CardCopyService.java index ba1496dfea9..9ed4e07b362 100644 --- a/forge-game/src/main/java/forge/game/card/CardCopyService.java +++ b/forge-game/src/main/java/forge/game/card/CardCopyService.java @@ -315,7 +315,7 @@ public class CardCopyService { newCopy.setSaddled(copyFrom.isSaddled()); if (newCopy.isSaddled()) newCopy.setSaddledByThisTurn(copyFrom.getSaddledByThisTurn()); if (copyFrom.isSuspected()) { - newCopy.setSuspectedEffect(getLKICopy(copyFrom.getSuspectedEffect(), cachedMap)); + newCopy.setSuspectedStatic(copyFrom.getSuspectedStatic().copy(newCopy, true)); } newCopy.setDamageHistory(copyFrom.getDamageHistory()); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index 5037fdb9b48..f7828ac4438 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -297,7 +297,9 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone * conditions are fulfilled. */ 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 attackersWithOptionalCost) {