From 839d040c8b76f3354f29e97b7bf7368380b480cc Mon Sep 17 00:00:00 2001 From: tool4ever Date: Fri, 12 Apr 2024 17:48:10 +0200 Subject: [PATCH] Fix Orvar (#5021) Co-authored-by: TRT <> --- .../src/main/java/forge/ai/ability/AttachAi.java | 2 +- .../main/java/forge/ai/ability/PermanentAi.java | 2 +- .../src/main/java/forge/game/ForgeScript.java | 2 +- .../src/main/java/forge/game/GameActionUtil.java | 2 +- .../main/java/forge/game/card/CardProperty.java | 11 +++++++---- .../src/main/java/forge/game/player/Player.java | 14 -------------- .../java/forge/game/spellability/SpellAbility.java | 2 +- 7 files changed, 12 insertions(+), 23 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index f915d8883b5..ca4fb8b9038 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -59,7 +59,7 @@ public class AttachAi extends SpellAbilityAi { // TODO: improve this so that the AI can use a flash aura buff as a means of killing opposing creatures // and gaining card advantage - if (source.hasKeyword("MayFlashSac") && !ai.couldCastSorcery(sa)) { + if (source.hasKeyword("MayFlashSac") && !ai.canCastSorcery()) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java index 3d7c3705418..e533eec95cd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java @@ -29,7 +29,7 @@ public class PermanentAi extends SpellAbilityAi { protected boolean checkPhaseRestrictions(final Player ai, final SpellAbility sa, final PhaseHandler ph) { final Card card = sa.getHostCard(); - if (card.hasKeyword("MayFlashSac") && !ai.couldCastSorcery(sa)) { + if (card.hasKeyword("MayFlashSac") && !ai.canCastSorcery()) { // AiPlayDecision.AnotherTime return false; } diff --git a/forge-game/src/main/java/forge/game/ForgeScript.java b/forge-game/src/main/java/forge/game/ForgeScript.java index c9f59ad8056..72e977fce8f 100644 --- a/forge-game/src/main/java/forge/game/ForgeScript.java +++ b/forge-game/src/main/java/forge/game/ForgeScript.java @@ -340,7 +340,7 @@ public class ForgeScript { String unescaped = k[1].replace("~", "+"); boolean found = false; for (GameObject o : AbilityUtils.getDefinedObjects(source, unescaped, spellAbility)) { - if (sa.isTargeting(o)) { + if (sa.getRootAbility().isTargeting(o)) { found = true; break; } diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 84b6c456b7e..1ac51be78a2 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -111,7 +111,7 @@ public final class GameActionUtil { for (CardPlayOption o : source.mayPlay(activator)) { // do not appear if it can be cast with SorcerySpeed - if (o.getAbility().hasParam("MayPlayNotSorcerySpeed") && activator.couldCastSorcery(sa)) { + if (o.getAbility().hasParam("MayPlayNotSorcerySpeed") && activator.canCastSorcery()) { continue; } // non basic are only allowed if PayManaCost is yes diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 466b316f40c..e7116463535 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -305,7 +305,7 @@ public class CardProperty { return false; } SpellAbility sp = (SpellAbility)spellAbility; - if (!sp.isTargeting(card)) { + if (!sp.getRootAbility().isTargeting(card)) { return false; } } else if (property.equals("TargetedPlayerCtrl")) { @@ -607,9 +607,12 @@ public class CardProperty { } } else if (property.startsWith("CanBeTargetedBy")) { final String def = property.substring(15); - final SpellAbility targetingSA = AbilityUtils.getDefinedSpellAbilities(source, def, spellAbility).get(0); - if (!targetingSA.canTarget(card)) { - return false; + SpellAbility targetingSA = AbilityUtils.getDefinedSpellAbilities(source, def, spellAbility).get(0); + while (targetingSA != null) { + if (targetingSA.usesTargeting() && !targetingSA.canTarget(card)) { + return false; + } + targetingSA = targetingSA.getSubAbility(); } } else if (property.startsWith("HauntedBy")) { if (!card.isHauntedBy(source)) { diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 9d4cf77d02a..5744a10806c 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -2519,20 +2519,6 @@ public class Player extends GameEntity implements Comparable { return now.isPlayerTurn(this) && now.getPhase().isMain() && game.getStack().isEmpty(); } - //NOTE: for conditions the stack must only have the sa being checked - public boolean couldCastSorcery(final SpellAbility sa) { - final Card source = sa.getRootAbility().getHostCard(); - - for (final Card card : game.getCardsIn(ZoneType.Stack)) { - if (!card.equals(source)) { - return false; - } - } - - PhaseHandler now = game.getPhaseHandler(); - return now.isPlayerTurn(this) && now.getPhase().isMain(); - } - public final PlayerController getController() { if (!controlledBy.isEmpty()) { return controlledBy.lastEntry().getValue().getValue(); 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 a07af144507..9d4a1373291 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -2068,7 +2068,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit if (getTargets().contains(o)) { return true; } - SpellAbility p = getParent(); + SpellAbility p = getSubAbility(); return p != null && p.isTargeting(o); }