From ac67a36ccfc38ae065b8c20f2db671fbcb44272a Mon Sep 17 00:00:00 2001 From: tool4ever Date: Tue, 25 Mar 2025 19:08:36 +0100 Subject: [PATCH] Replace first withContext call with more stable AI prediction (#7261) --- .../java/forge/game/ability/AbilityKey.java | 1 + .../game/ability/effects/SkipPhaseEffect.java | 2 +- .../java/forge/game/phase/PhaseHandler.java | 1 + .../game/replacement/ReplaceBeginPhase.java | 9 +++++++++ .../game/replacement/ReplacementHandler.java | 17 +++++++---------- forge-gui/res/cardsfolder/c/colfenors_plans.txt | 2 +- .../res/cardsfolder/d/damia_sage_of_stone.txt | 2 +- .../res/cardsfolder/d/desolation_angel.txt | 2 +- .../res/cardsfolder/d/desolation_giant.txt | 2 +- .../res/cardsfolder/d/dragon_appeasement.txt | 2 +- forge-gui/res/cardsfolder/e/eon_hub.txt | 2 +- forge-gui/res/cardsfolder/f/fasting.txt | 2 +- .../res/cardsfolder/g/gibbering_descent.txt | 2 +- .../res/cardsfolder/i/infernal_sovereign.txt | 2 +- .../res/cardsfolder/m/monstrous_war_leech.txt | 2 +- forge-gui/res/cardsfolder/n/necrodominance.txt | 2 +- forge-gui/res/cardsfolder/n/necropotence.txt | 2 +- .../res/cardsfolder/n/necropotence_avatar.txt | 2 +- forge-gui/res/cardsfolder/n/null_profusion.txt | 2 +- .../res/cardsfolder/p/psychic_possession.txt | 2 +- forge-gui/res/cardsfolder/r/recycle.txt | 2 +- forge-gui/res/cardsfolder/s/sands_of_time.txt | 2 +- .../res/cardsfolder/s/solitary_confinement.txt | 2 +- forge-gui/res/cardsfolder/s/stasis.txt | 2 +- .../res/cardsfolder/s/symbiotic_deployment.txt | 2 +- .../res/cardsfolder/t/taigam_sidisis_hand.txt | 2 +- forge-gui/res/cardsfolder/t/the_eon_fog.txt | 2 +- forge-gui/res/cardsfolder/w/wild_wasteland.txt | 2 +- .../res/cardsfolder/y/yawgmoths_bargain.txt | 2 +- 29 files changed, 43 insertions(+), 35 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityKey.java b/forge-game/src/main/java/forge/game/ability/AbilityKey.java index 03426afa49c..3d931a47674 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityKey.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityKey.java @@ -111,6 +111,7 @@ public enum AbilityKey { OriginalDefender("OriginalDefender"), OriginalParams("OriginalParams"), PayingMana("PayingMana"), + Phase("Phase"), Player("Player"), PreventedAmount("PreventedAmount"), Produced("Produced"), diff --git a/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java index a3e0c76fed5..a21b24ec0ab 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java @@ -58,7 +58,7 @@ public class SkipPhaseEffect extends SpellAbilityEffect { final Card eff = createEffect(sa, player, name, image); final StringBuilder sb = new StringBuilder(); - sb.append("Event$ BeginPhase | ActiveZones$ Command | PlayerTurn$ You | ActivePhases$ "); + sb.append("Event$ BeginPhase | ActiveZones$ Command | ValidPlayer$ You | Phase$ "); sb.append(phase != null ? phase : step); if (duration != null && !isNextThisTurn) { sb.append(" | Skip$ True"); diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index c28e25698b1..8a30463b031 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -203,6 +203,7 @@ public class PhaseHandler implements java.io.Serializable { } final Map repRunParams = AbilityKey.mapFromAffected(playerTurn); + repRunParams.put(AbilityKey.Phase, phase); ReplacementResult repres = game.getReplacementHandler().run(ReplacementType.BeginPhase, repRunParams); if (repres != ReplacementResult.NotReplaced) { // Currently there is no effect to skip entire beginning phase diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceBeginPhase.java b/forge-game/src/main/java/forge/game/replacement/ReplaceBeginPhase.java index 4abaeffc829..6df66a4d57f 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceBeginPhase.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceBeginPhase.java @@ -4,6 +4,7 @@ import java.util.Map; import forge.game.ability.AbilityKey; import forge.game.card.Card; +import forge.game.phase.PhaseType; import forge.game.spellability.SpellAbility; public class ReplaceBeginPhase extends ReplacementEffect { @@ -18,6 +19,14 @@ public class ReplaceBeginPhase extends ReplacementEffect { @Override public boolean canReplace(Map runParams) { + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; + } + + if (hasParam("Phase") && !PhaseType.parseRange(getParam("Phase")).contains(runParams.get(AbilityKey.Phase))) { + return false; + } + return true; } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java b/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java index 1f656bb0cd4..afd07235a24 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java @@ -18,7 +18,6 @@ package forge.game.replacement; import java.util.*; -import java.util.concurrent.Callable; import com.google.common.base.MoreObjects; import forge.game.card.*; @@ -856,15 +855,13 @@ public class ReplacementHandler { * Helper function to check if a phase would be skipped for AI. */ public boolean wouldPhaseBeSkipped(final Player player, final PhaseType phase) { - Callable proc = () -> { - final Map repParams = AbilityKey.newMap(); - List list = getReplacementList(ReplacementType.BeginPhase, repParams, ReplacementLayer.Control); - if (list.isEmpty()) { - return false; - } - return true; - }; - return player.getGame().getPhaseHandler().withContext(proc, player, phase); + final Map repParams = AbilityKey.mapFromAffected(player); + repParams.put(AbilityKey.Phase, phase); + List list = getReplacementList(ReplacementType.BeginPhase, repParams, ReplacementLayer.Control); + if (list.isEmpty()) { + return false; + } + return true; } /** diff --git a/forge-gui/res/cardsfolder/c/colfenors_plans.txt b/forge-gui/res/cardsfolder/c/colfenors_plans.txt index 39745b5a0e0..bd1354dfe8c 100644 --- a/forge-gui/res/cardsfolder/c/colfenors_plans.txt +++ b/forge-gui/res/cardsfolder/c/colfenors_plans.txt @@ -4,7 +4,7 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters, exile the top seven cards of your library face down. You may look at the cards exiled with CARDNAME, and you may play lands and cast spells from among those cards. SVar:TrigExile:DB$ Dig | Defined$ You | DigNum$ 7 | ChangeNum$ All | DestinationZone$ Exile | ExileFaceDown$ True | NoReveal$ True S:Mode$ Continuous | Affected$ Card.ExiledWithSource | AffectedZone$ Exile | MayPlay$ True | MayLookAt$ You | Description$ You may look at the cards exiled with CARDNAME, and you may play lands and cast spells from among those cards. -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Draw | Skip$ True | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. S:Mode$ CantBeCast | ValidCard$ Card | Caster$ You | NumLimitEachTurn$ 1 | Description$ You can't cast more than one spell each turn. AI:RemoveDeck:All Oracle:When Colfenor's Plans enters, exile the top seven cards of your library face down.\nYou may look at the cards exiled with Colfenor's Plans, and you may play lands and cast spells from among those cards.\nSkip your draw step.\nYou can't cast more than one spell each turn. diff --git a/forge-gui/res/cardsfolder/d/damia_sage_of_stone.txt b/forge-gui/res/cardsfolder/d/damia_sage_of_stone.txt index f822ae70cdd..f3ea45b40c8 100644 --- a/forge-gui/res/cardsfolder/d/damia_sage_of_stone.txt +++ b/forge-gui/res/cardsfolder/d/damia_sage_of_stone.txt @@ -3,7 +3,7 @@ ManaCost:4 B G U Types:Legendary Creature Gorgon Wizard PT:4/4 K:Deathtouch -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Draw | Skip$ True | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ LT7 | Execute$ TrigDraw | TriggerDescription$ At the beginning of your upkeep, if you have fewer than seven cards in hand, draw cards equal to the difference. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ Difference SVar:X:Count$InYourHand diff --git a/forge-gui/res/cardsfolder/d/desolation_angel.txt b/forge-gui/res/cardsfolder/d/desolation_angel.txt index 3adfc7dec2f..85c6bb0d284 100644 --- a/forge-gui/res/cardsfolder/d/desolation_angel.txt +++ b/forge-gui/res/cardsfolder/d/desolation_angel.txt @@ -6,7 +6,7 @@ K:Flying K:Kicker:W W T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroyYourLand | TriggerDescription$ When CARDNAME enters, destroy all lands you control. If it was kicked, destroy all lands instead. SVar:TrigDestroyYourLand:DB$ DestroyAll | ValidCards$ Land.YouCtrl | ConditionDefined$ Self | ConditionPresent$ Card.!kicked | SubAbility$ TrigKicker -SVar:TrigKicker:DB$ DestroyAll | ValidCards$ Land | Condition$ Kicked +SVar:TrigKicker:DB$ DestroyAll | ValidCards$ Land | ConditionDefined$ Self | ConditionPresent$ Card.kicked AI:RemoveDeck:Random DeckNeeds:Color$White Oracle:Kicker {W}{W} (You may pay an additional {W}{W} as you cast this spell.)\nFlying\nWhen Desolation Angel enters, destroy all lands you control. If it was kicked, destroy all lands instead. diff --git a/forge-gui/res/cardsfolder/d/desolation_giant.txt b/forge-gui/res/cardsfolder/d/desolation_giant.txt index 440836cdd68..b0ee326de2f 100644 --- a/forge-gui/res/cardsfolder/d/desolation_giant.txt +++ b/forge-gui/res/cardsfolder/d/desolation_giant.txt @@ -5,7 +5,7 @@ PT:3/3 K:Kicker:W W T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters, destroy all other creatures you control. If it was kicked, destroy all other creatures instead. SVar:TrigDestroy:DB$ DestroyAll | ValidCards$ Creature.StrictlyOther+YouCtrl | ConditionDefined$ Self | ConditionPresent$ Card.!kicked | SubAbility$ TrigKicker -SVar:TrigKicker:DB$ DestroyAll | ValidCards$ Creature.StrictlyOther | Condition$ Kicked +SVar:TrigKicker:DB$ DestroyAll | ValidCards$ Creature.StrictlyOther | ConditionDefined$ Self | ConditionPresent$ Card.kicked AI:RemoveDeck:All AI:RemoveDeck:Random DeckNeeds:Color$White diff --git a/forge-gui/res/cardsfolder/d/dragon_appeasement.txt b/forge-gui/res/cardsfolder/d/dragon_appeasement.txt index b8ecec95d20..a650cb8253c 100644 --- a/forge-gui/res/cardsfolder/d/dragon_appeasement.txt +++ b/forge-gui/res/cardsfolder/d/dragon_appeasement.txt @@ -1,7 +1,7 @@ Name:Dragon Appeasement ManaCost:3 B R G Types:Enchantment -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Draw | Skip$ True | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. T:Mode$ Sacrificed | ValidCard$ Creature.YouCtrl | Execute$ TrigDrawCard | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice a creature, you may draw a card. SVar:TrigDrawCard:DB$ Draw | Defined$ You | NumCards$ 1 AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/e/eon_hub.txt b/forge-gui/res/cardsfolder/e/eon_hub.txt index e77eaa6bbbe..c4008c45149 100644 --- a/forge-gui/res/cardsfolder/e/eon_hub.txt +++ b/forge-gui/res/cardsfolder/e/eon_hub.txt @@ -1,7 +1,7 @@ Name:Eon Hub ManaCost:5 Types:Artifact -R:Event$ BeginPhase | ActiveZones$ Battlefield | ActivePhases$ Upkeep | Skip$ True | Description$ Players skip their upkeep steps. +R:Event$ BeginPhase | ActiveZones$ Battlefield | Phase$ Upkeep | Skip$ True | Description$ Players skip their upkeep steps. SVar:NonStackingEffect:True AI:RemoveDeck:Random Oracle:Players skip their upkeep steps. diff --git a/forge-gui/res/cardsfolder/f/fasting.txt b/forge-gui/res/cardsfolder/f/fasting.txt index 4ac20ba9ce4..52cb1fd097a 100644 --- a/forge-gui/res/cardsfolder/f/fasting.txt +++ b/forge-gui/res/cardsfolder/f/fasting.txt @@ -4,7 +4,7 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutHunger | TriggerDescription$ At the beginning of your upkeep, put a hunger counter on CARDNAME. Then destroy CARDNAME if it has five or more hunger counters on it. SVar:TrigPutHunger:DB$ PutCounter | Defined$ Self | CounterType$ HUNGER | CounterNum$ 1 | SubAbility$ DBDestroyHunger SVar:DBDestroyHunger:DB$ Destroy | Defined$ Self | ConditionDefined$ Self | ConditionPresent$ Card.counters_GE5_HUNGER -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Draw | Layer$ Other | Optional$ True | ReplaceWith$ DBGainLife | Description$ If you would begin your draw step, you may skip that step instead. If you do, you gain 2 life. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Layer$ Other | Optional$ True | ReplaceWith$ DBGainLife | Description$ If you would begin your draw step, you may skip that step instead. If you do, you gain 2 life. SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 T:Mode$ Drawn | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ DBDestroySelf | TriggerDescription$ When you draw a card, destroy CARDNAME. SVar:DBDestroySelf:DB$ Destroy | Defined$ Self diff --git a/forge-gui/res/cardsfolder/g/gibbering_descent.txt b/forge-gui/res/cardsfolder/g/gibbering_descent.txt index 53cee01620f..589baef578a 100644 --- a/forge-gui/res/cardsfolder/g/gibbering_descent.txt +++ b/forge-gui/res/cardsfolder/g/gibbering_descent.txt @@ -2,7 +2,7 @@ Name:Gibbering Descent ManaCost:4 B B Types:Enchantment K:Madness:2 B B -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Upkeep | Skip$ True | Hellbent$ True | Description$ Hellbent — Skip your upkeep step if you have no cards in hand. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Upkeep | Skip$ True | Hellbent$ True | Description$ Hellbent — Skip your upkeep step if you have no cards in hand. T:Mode$ Phase | Phase$ Upkeep | Execute$ TrigLoseLifeDiscard | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player loses 1 life and discards a card. SVar:TrigLoseLifeDiscard:DB$ LoseLife | Defined$ TriggeredPlayer | LifeAmount$ 1 | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ TriggeredPlayer | NumCards$ 1 | Mode$ TgtChoose diff --git a/forge-gui/res/cardsfolder/i/infernal_sovereign.txt b/forge-gui/res/cardsfolder/i/infernal_sovereign.txt index 707f223762f..f583c57e09f 100644 --- a/forge-gui/res/cardsfolder/i/infernal_sovereign.txt +++ b/forge-gui/res/cardsfolder/i/infernal_sovereign.txt @@ -4,7 +4,7 @@ Types:Creature Demon PT:6/6 K:Flying K:Trample -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Draw | Skip$ True | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you play a land or cast a spell, you draw a card and you lose 1 life. T:Mode$ LandPlayed | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | Secondary$ True | TriggerDescription$ Whenever you play a land or cast a spell, you draw a card and you lose 1 life. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBLoseLife diff --git a/forge-gui/res/cardsfolder/m/monstrous_war_leech.txt b/forge-gui/res/cardsfolder/m/monstrous_war_leech.txt index 5276324a490..fa47b11f230 100644 --- a/forge-gui/res/cardsfolder/m/monstrous_war_leech.txt +++ b/forge-gui/res/cardsfolder/m/monstrous_war_leech.txt @@ -4,7 +4,7 @@ Types:Creature Leech Horror PT:*/* K:Kicker:U K:ETBReplacement:Other:TrigMill -SVar:TrigMill:DB$ Mill | NumCards$ 4 | Defined$ You | Condition$ Kicked | SpellDescription$ As CARDNAME enters, if it was kicked, mill four cards. (To mill a card, put the top card of your library into your graveyard.) +SVar:TrigMill:DB$ Mill | NumCards$ 4 | Defined$ You | ConditionDefined$ Self | ConditionPresent$ Card.kicked | SpellDescription$ As CARDNAME enters, if it was kicked, mill four cards. (To mill a card, put the top card of your library into your graveyard.) S:Mode$ Continuous | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the highest mana value among cards in your graveyard. SVar:X:Count$ValidGraveyard Card.YouOwn$GreatestCMC SVar:NoZeroToughnessAI:True diff --git a/forge-gui/res/cardsfolder/n/necrodominance.txt b/forge-gui/res/cardsfolder/n/necrodominance.txt index ff82748764d..d76b063327e 100644 --- a/forge-gui/res/cardsfolder/n/necrodominance.txt +++ b/forge-gui/res/cardsfolder/n/necrodominance.txt @@ -1,7 +1,7 @@ Name:Necrodominance ManaCost:B B B Types:Legendary Enchantment -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Draw | Skip$ True | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your end step, you may pay any amount of life. If you do, draw that many cards. SVar:TrigDraw:AB$ Draw | Cost$ PayLife | NumCards$ X SVar:X:Count$xPaid diff --git a/forge-gui/res/cardsfolder/n/necropotence.txt b/forge-gui/res/cardsfolder/n/necropotence.txt index b9fbcf1f904..398f940b06c 100644 --- a/forge-gui/res/cardsfolder/n/necropotence.txt +++ b/forge-gui/res/cardsfolder/n/necropotence.txt @@ -1,7 +1,7 @@ Name:Necropotence ManaCost:B B B Types:Enchantment -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Draw | Skip$ True | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. T:Mode$ Discarded | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ Whenever you discard a card, exile that card from your graveyard. SVar:TrigChange:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile A:AB$ ChangeZone | Cost$ PayLife<1> | Defined$ TopOfLibrary | Origin$ Library | Destination$ Exile | ExileFaceDown$ True | RememberChanged$ True | SubAbility$ DelayedReturn | AILogic$ Necropotence | AILifeThreshold$ 1 | SpellDescription$ Exile the top card of your library face down. Put that card into your hand at the beginning of your next end step. diff --git a/forge-gui/res/cardsfolder/n/necropotence_avatar.txt b/forge-gui/res/cardsfolder/n/necropotence_avatar.txt index 8d6d8b5cbd2..542aeccffe1 100644 --- a/forge-gui/res/cardsfolder/n/necropotence_avatar.txt +++ b/forge-gui/res/cardsfolder/n/necropotence_avatar.txt @@ -2,7 +2,7 @@ Name:Necropotence Avatar ManaCost:no cost Types:Vanguard HandLifeModifier:+0/+4 -R:Event$ BeginPhase | ActiveZones$ Command | PlayerTurn$ You | ActivePhases$ Draw | Skip$ True | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Command | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. T:Mode$ Phase | Phase$ End Of Turn | ValidPlayer$ You | TriggerZones$ Command | CheckSVar$ Turns | SVarCompare$ GT1 | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, if it's not the first turn of the game, put a death counter on CARDNAME. You draw X cards and you lose X life, where X is the number of death counters on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ DEATH | CounterNum$ 1 | SubAbility$ TrigDraw SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ X | SubAbility$ DBLoseLife diff --git a/forge-gui/res/cardsfolder/n/null_profusion.txt b/forge-gui/res/cardsfolder/n/null_profusion.txt index f9cbbb6dcf9..118a2cddbc3 100644 --- a/forge-gui/res/cardsfolder/n/null_profusion.txt +++ b/forge-gui/res/cardsfolder/n/null_profusion.txt @@ -1,7 +1,7 @@ Name:Null Profusion ManaCost:4 B B Types:Enchantment -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Draw | Skip$ True | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. S:Mode$ Continuous | Affected$ You | SetMaxHandSize$ 2 | Description$ Your maximum hand size is 2. T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you play a card, draw a card. T:Mode$ LandPlayed | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | Secondary$ True | TriggerDescription$ Whenever you play a card, draw a card. diff --git a/forge-gui/res/cardsfolder/p/psychic_possession.txt b/forge-gui/res/cardsfolder/p/psychic_possession.txt index 1a8a1afae7e..7b4f6bd144a 100644 --- a/forge-gui/res/cardsfolder/p/psychic_possession.txt +++ b/forge-gui/res/cardsfolder/p/psychic_possession.txt @@ -3,7 +3,7 @@ ManaCost:2 U U Types:Enchantment Aura K:Enchant opponent A:SP$ Attach | ValidTgts$ Opponent | AILogic$ Curse -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Draw | Skip$ True | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. T:Mode$ Drawn | ValidCard$ Card.OwnedBy Player.EnchantedBy | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever enchanted opponent draws a card, you may draw a card. SVar:TrigDraw:DB$ Draw | NumCards$ 1 AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/r/recycle.txt b/forge-gui/res/cardsfolder/r/recycle.txt index 42650b299bf..f3dfacc7f11 100644 --- a/forge-gui/res/cardsfolder/r/recycle.txt +++ b/forge-gui/res/cardsfolder/r/recycle.txt @@ -1,7 +1,7 @@ Name:Recycle ManaCost:4 G G Types:Enchantment -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Draw | Skip$ True | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. S:Mode$ Continuous | Affected$ You | SetMaxHandSize$ 2 | Description$ Your maximum hand size is 2. T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you play a card, draw a card. T:Mode$ LandPlayed | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | Secondary$ True | TriggerDescription$ Whenever you play a card, draw a card. diff --git a/forge-gui/res/cardsfolder/s/sands_of_time.txt b/forge-gui/res/cardsfolder/s/sands_of_time.txt index 5d72132cf7f..9192f2cd9a8 100644 --- a/forge-gui/res/cardsfolder/s/sands_of_time.txt +++ b/forge-gui/res/cardsfolder/s/sands_of_time.txt @@ -1,7 +1,7 @@ Name:Sands of Time ManaCost:4 Types:Artifact -R:Event$ BeginPhase | ActiveZones$ Battlefield | ActivePhases$ Untap | Skip$ True | Description$ Each player skips their untap step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | Phase$ Untap | Skip$ True | Description$ Each player skips their untap step. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigSands | TriggerDescription$ At the beginning of each player's upkeep, that player simultaneously untaps each tapped artifact, creature, and land they control and taps each untapped artifact, creature, and land they control. SVar:TrigSands:DB$ UntapAll | Defined$ TriggeredPlayer | ValidCards$ Artifact.tapped,Creature.tapped,Land.tapped | RememberUntapped$ True | SubAbility$ DBTap SVar:DBTap:DB$ TapAll | Defined$ TriggeredPlayer | ValidCards$ Artifact.untapped+IsNotRemembered,Creature.untapped+IsNotRemembered,Land.untapped+IsNotRemembered | TapperController$ True | SubAbility$ DBCleanup diff --git a/forge-gui/res/cardsfolder/s/solitary_confinement.txt b/forge-gui/res/cardsfolder/s/solitary_confinement.txt index 55cb405fd6a..8cb7c34a94c 100644 --- a/forge-gui/res/cardsfolder/s/solitary_confinement.txt +++ b/forge-gui/res/cardsfolder/s/solitary_confinement.txt @@ -3,7 +3,7 @@ ManaCost:2 W Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigUpkeep | TriggerDescription$ At the beginning of your upkeep, sacrifice CARDNAME unless you discard a card. SVar:TrigUpkeep:DB$ Sacrifice | UnlessPayer$ You | UnlessCost$ Discard<1/Card> -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Draw | Skip$ True | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. S:Mode$ Continuous | Affected$ You | AddKeyword$ Shroud | Description$ You have shroud. (You can't be the target of spells or abilities.) R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidTarget$ You | Description$ Prevent all damage that would be dealt to you. AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/s/stasis.txt b/forge-gui/res/cardsfolder/s/stasis.txt index 485fbb81965..4bccb1cf0fc 100644 --- a/forge-gui/res/cardsfolder/s/stasis.txt +++ b/forge-gui/res/cardsfolder/s/stasis.txt @@ -1,7 +1,7 @@ Name:Stasis ManaCost:1 U Types:Enchantment -R:Event$ BeginPhase | ActiveZones$ Battlefield | ActivePhases$ Untap | Skip$ True | Description$ Players skip their untap steps. +R:Event$ BeginPhase | ActiveZones$ Battlefield | Phase$ Untap | Skip$ True | Description$ Players skip their untap steps. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigUpkeep | TriggerDescription$ At the beginning of your upkeep, sacrifice CARDNAME unless you pay {U}. SVar:TrigUpkeep:DB$ Sacrifice | UnlessPayer$ You | UnlessCost$ U AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/s/symbiotic_deployment.txt b/forge-gui/res/cardsfolder/s/symbiotic_deployment.txt index 7d8884d4552..49c3f867641 100644 --- a/forge-gui/res/cardsfolder/s/symbiotic_deployment.txt +++ b/forge-gui/res/cardsfolder/s/symbiotic_deployment.txt @@ -1,7 +1,7 @@ Name:Symbiotic Deployment ManaCost:2 G Types:Enchantment -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Draw | Skip$ True | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. A:AB$ Draw | Cost$ 1 tapXType<2/Creature> | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card. AI:RemoveDeck:Random SVar:NonStackingEffect:True diff --git a/forge-gui/res/cardsfolder/t/taigam_sidisis_hand.txt b/forge-gui/res/cardsfolder/t/taigam_sidisis_hand.txt index 47761ef54ef..805972b95f9 100644 --- a/forge-gui/res/cardsfolder/t/taigam_sidisis_hand.txt +++ b/forge-gui/res/cardsfolder/t/taigam_sidisis_hand.txt @@ -2,7 +2,7 @@ Name:Taigam, Sidisi's Hand ManaCost:3 U B Types:Legendary Creature Human Wizard PT:3/4 -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Draw | Skip$ True | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. SVar:TrigDig:DB$ Dig | DigNum$ 3 | DestinationZone2$ Graveyard | NoReveal$ True | SpellDescription$ Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. A:AB$ Pump | Cost$ B T ExileFromGrave | CostDesc$ {B}, {T}, Exile X cards from your graveyard: | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | SpellDescription$ Target creature gets -X/-X until end of turn. diff --git a/forge-gui/res/cardsfolder/t/the_eon_fog.txt b/forge-gui/res/cardsfolder/t/the_eon_fog.txt index 7b127d2c111..99321af1928 100644 --- a/forge-gui/res/cardsfolder/t/the_eon_fog.txt +++ b/forge-gui/res/cardsfolder/t/the_eon_fog.txt @@ -1,7 +1,7 @@ Name:The Eon Fog ManaCost:no cost Types:Plane Equilor -R:Event$ BeginPhase | ActiveZones$ Command | ActivePhases$ Untap | Skip$ True | Description$ Players skip their untap steps. +R:Event$ BeginPhase | ActiveZones$ Command | Phase$ Untap | Skip$ True | Description$ Players skip their untap steps. T:Mode$ ChaosEnsues | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, untap all permanents you control. SVar:RolledChaos:DB$ UntapAll | ValidCards$ Permanent.YouCtrl SVar:AIRollPlanarDieParams:Mode$ Always | LowPriority$ True | MaxRollsPerTurn$ 9 diff --git a/forge-gui/res/cardsfolder/w/wild_wasteland.txt b/forge-gui/res/cardsfolder/w/wild_wasteland.txt index bd5968a109b..ebb713a498b 100644 --- a/forge-gui/res/cardsfolder/w/wild_wasteland.txt +++ b/forge-gui/res/cardsfolder/w/wild_wasteland.txt @@ -1,7 +1,7 @@ Name:Wild Wasteland ManaCost:2 R Types:Enchantment -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Draw | Skip$ True | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ ExileTwo | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, exile the top two cards of your library. You may play those cards this turn. SVar:ExileTwo:DB$ Dig | Defined$ You | DigNum$ 2 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ STPlay | SubAbility$ DBCleanup | ForgetOnMoved$ Exile | Duration$ EndOfTurn diff --git a/forge-gui/res/cardsfolder/y/yawgmoths_bargain.txt b/forge-gui/res/cardsfolder/y/yawgmoths_bargain.txt index 6cc5f51b54f..affe240cdc2 100644 --- a/forge-gui/res/cardsfolder/y/yawgmoths_bargain.txt +++ b/forge-gui/res/cardsfolder/y/yawgmoths_bargain.txt @@ -1,7 +1,7 @@ Name:Yawgmoth's Bargain ManaCost:4 B B Types:Enchantment -R:Event$ BeginPhase | ActiveZones$ Battlefield | PlayerTurn$ You | ActivePhases$ Draw | Skip$ True | Description$ Skip your draw step. +R:Event$ BeginPhase | ActiveZones$ Battlefield | ValidPlayer$ You | Phase$ Draw | Skip$ True | Description$ Skip your draw step. A:AB$ Draw | Cost$ PayLife<1> | NumCards$ 1 | AILogic$ YawgmothsBargain | AILifeThreshold$ 1 | SpellDescription$ Draw a card. SVar:AICastPreference:NeverCastIfLifeBelow$ 7 AI:RemoveDeck:Random