From 3d8a008378868c7ac7fff0fc6a3fed8d582e1513 Mon Sep 17 00:00:00 2001 From: TRT <> Date: Thu, 31 Mar 2022 10:31:37 +0200 Subject: [PATCH 1/4] fix hasManaAbility --- forge-game/src/main/java/forge/game/ForgeScript.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ForgeScript.java b/forge-game/src/main/java/forge/game/ForgeScript.java index 68be94add97..0e1a178063b 100644 --- a/forge-game/src/main/java/forge/game/ForgeScript.java +++ b/forge-game/src/main/java/forge/game/ForgeScript.java @@ -115,8 +115,14 @@ public class ForgeScript { return true; } for (final Trigger trig : cardState.getTriggers()) { - if (trig.getOverridingAbility() != null && trig.getOverridingAbility().isManaAbility()) { - return true; + SpellAbility sa = trig.getOverridingAbility(); + if (sa != null) { + if (!sa.isTrigger()) { + sa.setTrigger(trig); + } + if (sa.isManaAbility()) { + return true; + } } } return false; From e3596b279ee562aa54766ab752d8bfb23557a6b5 Mon Sep 17 00:00:00 2001 From: TRT <> Date: Thu, 31 Mar 2022 13:40:24 +0200 Subject: [PATCH 2/4] Clean up --- .../src/main/java/forge/game/card/CardProperty.java | 11 ----------- forge-gui/res/cardsfolder/m/midnight_arsonist.txt | 2 +- .../main/java/forge/gui/card/CardScriptParser.java | 2 +- 3 files changed, 2 insertions(+), 13 deletions(-) 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 ddecade728c..c32526e2c40 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -21,9 +21,7 @@ import forge.game.mana.Mana; import forge.game.player.Player; import forge.game.spellability.OptionalCost; import forge.game.spellability.SpellAbility; -import forge.game.spellability.SpellAbilityPredicates; import forge.game.spellability.SpellAbilityStackInstance; -import forge.game.trigger.Trigger; import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.item.PaperCard; @@ -388,15 +386,6 @@ public class CardProperty { if (!card.equals(source.getEffectSource())) { return false; } - } else if (property.equals("withoutManaAbility")) { - if (Iterables.any(card.getSpellAbilities(), SpellAbilityPredicates.isManaAbility())) { - return false; - } - for (final Trigger trig : card.getTriggers()) { - if (trig.getOverridingAbility() != null && !trig.getOverridingAbility().isManaAbility()) { - return false; - } - } } else if (property.equals("CanBeSacrificedBy") && spellAbility instanceof SpellAbility) { // used for Emerge and Offering, these are SpellCost, not effect if (!card.canBeSacrificedBy((SpellAbility) spellAbility, false)) { diff --git a/forge-gui/res/cardsfolder/m/midnight_arsonist.txt b/forge-gui/res/cardsfolder/m/midnight_arsonist.txt index 2ca1c5869c1..343d3ef87e2 100644 --- a/forge-gui/res/cardsfolder/m/midnight_arsonist.txt +++ b/forge-gui/res/cardsfolder/m/midnight_arsonist.txt @@ -3,7 +3,7 @@ ManaCost:3 R Types:Creature Vampire PT:3/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy up to X target artifacts without mana abilities, where X is the number of Vampires you control. -SVar:TrigDestroy:DB$ Destroy | TargetMin$ 0 | TargetMax$ X | ValidTgts$ Artifact.withoutManaAbility | TgtPrompt$ Select up to X target artifacts without mana abilities +SVar:TrigDestroy:DB$ Destroy | TargetMin$ 0 | TargetMax$ X | ValidTgts$ Artifact.!hasManaAbility | TgtPrompt$ Select up to X target artifacts without mana abilities SVar:X:Count$Valid Vampire.YouCtrl DeckHints:Type$Vampire AI:RemoveDeck:Random diff --git a/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java b/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java index 10ee2a03ff2..a06228b7122 100644 --- a/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java +++ b/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java @@ -487,7 +487,7 @@ public final class CardScriptParser { "HasDevoured", "HasNotDevoured", "IsMonstrous", "IsNotMonstrous", "CostsPhyrexianMana", "IsRemembered", "IsNotRemembered", "IsImprinted", "IsNotImprinted", "hasActivatedAbilityWithTapCost", - "hasActivatedAbility", "hasManaAbility", "withoutManaAbility", + "hasActivatedAbility", "hasManaAbility", "hasNonManaActivatedAbility", "NoAbilities", "HasCounters", "wasNotCast", "ChosenType", "IsNotChosenType", "IsCommander", "IsNotCommander","IsRenowned", "IsNotRenowned"); From 88c7e87095234be9e92376a4cf1d699cce286f9a Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Thu, 31 Mar 2022 19:53:32 +0200 Subject: [PATCH 3/4] Use getOverridingAbility --- .../src/main/java/forge/ai/ability/ControlGainAi.java | 2 +- forge-game/src/main/java/forge/game/ForgeScript.java | 9 ++------- .../src/main/java/forge/game/TriggerReplacementBase.java | 4 ++++ .../src/main/java/forge/game/card/CardProperty.java | 2 +- forge-gui/res/cardsfolder/a/archfiends_vessel.txt | 5 ++--- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java index 99c04f04446..c7a4a88a13e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java @@ -142,7 +142,7 @@ public class ControlGainAi extends SpellAbilityAi { return true; } - if (c.canBeControlledBy(ai)) { + if (!c.canBeControlledBy(ai)) { 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 0e1a178063b..a1b683a14ec 100644 --- a/forge-game/src/main/java/forge/game/ForgeScript.java +++ b/forge-game/src/main/java/forge/game/ForgeScript.java @@ -116,13 +116,8 @@ public class ForgeScript { } for (final Trigger trig : cardState.getTriggers()) { SpellAbility sa = trig.getOverridingAbility(); - if (sa != null) { - if (!sa.isTrigger()) { - sa.setTrigger(trig); - } - if (sa.isManaAbility()) { - return true; - } + if (sa != null && sa.isManaAbility()) { + return true; } } return false; diff --git a/forge-game/src/main/java/forge/game/TriggerReplacementBase.java b/forge-game/src/main/java/forge/game/TriggerReplacementBase.java index 3e636eb4968..2b89bdd01be 100644 --- a/forge-game/src/main/java/forge/game/TriggerReplacementBase.java +++ b/forge-game/src/main/java/forge/game/TriggerReplacementBase.java @@ -6,6 +6,7 @@ import java.util.Set; import forge.game.card.Card; import forge.game.card.CardState; import forge.game.spellability.SpellAbility; +import forge.game.trigger.Trigger; import forge.game.zone.Zone; import forge.game.zone.ZoneType; @@ -63,6 +64,9 @@ public abstract class TriggerReplacementBase extends CardTraitBase implements II * @return the overridingAbility */ public SpellAbility getOverridingAbility() { + if (overridingAbility != null && !overridingAbility.isTrigger() && this instanceof Trigger) { + overridingAbility.setTrigger((Trigger) this); + } return this.overridingAbility; } 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 c32526e2c40..ba2cd97540e 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -1778,7 +1778,7 @@ public class CardProperty { if (!castSA.isValid(v, sourceController, source, spellAbility)) { return false; } - }else if (property.startsWith("wasCastFrom")) { + } else if (property.startsWith("wasCastFrom")) { boolean byYou = property.contains("ByYou"); String strZone = property.substring(11); Player zoneOwner = null; diff --git a/forge-gui/res/cardsfolder/a/archfiends_vessel.txt b/forge-gui/res/cardsfolder/a/archfiends_vessel.txt index b2dbac5cfc5..a13e2716912 100644 --- a/forge-gui/res/cardsfolder/a/archfiends_vessel.txt +++ b/forge-gui/res/cardsfolder/a/archfiends_vessel.txt @@ -3,11 +3,10 @@ ManaCost:B Types:Creature Human Cleric PT:1/1 K:Lifelink -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | CheckSVar$ GraveCheck | TriggerDescription$ When CARDNAME enters the battlefield, if it entered from your graveyard or you cast it from your graveyard, exile it. If you do, create a 5/5 black Demon creature token with flying. +T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, if it entered from your graveyard or you cast it from your graveyard, exile it. If you do, create a 5/5 black Demon creature token with flying. +T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self+wasCastFromYourGraveyardByYou | Execute$ TrigExile | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if it entered from your graveyard or you cast it from your graveyard, exile it. If you do, create a 5/5 black Demon creature token with flying. SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ Self | SubAbility$ DBToken | RememberChanged$ True SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_5_5_demon_flying | TokenOwner$ You | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | ConditionCompare$ GE1 -SVar:GraveCheck:Count$wasCastFromYourGraveyardByYou.1.0/Plus.GraveCheck2 -SVar:GraveCheck2:TriggeredCardLKI$Valid Card.inZoneGraveyard DeckHas:Ability$Token DeckHints:Ability$Graveyard Oracle:Lifelink (Damage dealt by this creature also causes you to gain that much life.)\nWhen Archfiend's Vessel enters the battlefield, if it entered from your graveyard or you cast it from your graveyard, exile it. If you do, create a 5/5 black Demon creature token with flying. From 5d682e961605cd1f5e60416c9090c6914ffd869d Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Thu, 31 Mar 2022 22:15:36 +0200 Subject: [PATCH 4/4] Script fix --- forge-gui/res/cardsfolder/b/breathless_knight.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/b/breathless_knight.txt b/forge-gui/res/cardsfolder/b/breathless_knight.txt index 3a1499fa0da..529b8710e21 100644 --- a/forge-gui/res/cardsfolder/b/breathless_knight.txt +++ b/forge-gui/res/cardsfolder/b/breathless_knight.txt @@ -4,8 +4,8 @@ Types:Creature Spirit Knight PT:2/2 K:Flying K:Lifelink -T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Battlefield | TriggerZones$ Battlefield | ValidCard$ Creature.YouOwn+Other,Creature.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME or another creature enters the battlefield under your control, if that creature entered from a graveyard or you cast it from a graveyard, put a +1/+1 counter on CARDNAME. -T:Mode$ ChangesZone | Destination$ Battlefield | TriggerZones$ Battlefield | ValidCard$ Creature.YouOwn+Other+wasCastFromGraveyard,Creature.Self+wasCastFromGraveyard | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another creature enters the battlefield under your control, if that creature entered from a graveyard or you cast it from a graveyard, put a +1/+1 counter on CARDNAME. +T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Battlefield | TriggerZones$ Battlefield | ValidCard$ Creature.YouCtrl+Other,Creature.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME or another creature enters the battlefield under your control, if that creature entered from a graveyard or you cast it from a graveyard, put a +1/+1 counter on CARDNAME. +T:Mode$ ChangesZone | Destination$ Battlefield | TriggerZones$ Battlefield | ValidCard$ Creature.YouCtrl+Other+wasCastFromGraveyardByYou,Creature.Self+wasCastFromGraveyardByYou | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another creature enters the battlefield under your control, if that creature entered from a graveyard or you cast it from a graveyard, put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterNum$ 1 | CounterType$ P1P1 DeckHas:Ability$Counters Oracle:Flying, lifelink\nWhenever Breathless Knight or another creature enters the battlefield under your control, if that creature entered from a graveyard or you cast it from a graveyard, put a +1/+1 counter on Breathless Knight.