From 419ca27328ad4331bc7401852f9a18b8a14a0881 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Mon, 16 Sep 2024 05:53:15 +0200 Subject: [PATCH 01/37] Update commander_liara_portyr.txt (#6152) --- .../res/cardsfolder/c/commander_liara_portyr.txt | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/commander_liara_portyr.txt b/forge-gui/res/cardsfolder/c/commander_liara_portyr.txt index 7dab340302e..987be1e46ad 100644 --- a/forge-gui/res/cardsfolder/c/commander_liara_portyr.txt +++ b/forge-gui/res/cardsfolder/c/commander_liara_portyr.txt @@ -3,14 +3,11 @@ ManaCost:3 R W Types:Legendary Creature Human Soldier PT:5/3 T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigDig | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, spells you cast from exile this turn cost {X} less to cast, where X is the number of players being attacked. Exile the top X cards of your library. Until end of turn, you may cast spells from among those exiled cards. -SVar:TrigDig:DB$ Dig | DigNum$ X | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBStoreNum -SVar:DBStoreNum:DB$ StoreSVar | SVar$ Y | Type$ Calculate | Expression$ X | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | StaticAbilities$ ReduceCost,STPlay | RememberObjects$ Remembered | SubAbility$ DBCleanup -SVar:ReduceCost:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Card.wasCastFromExile | Type$ Spell | Activator$ You | Amount$ Y | Description$ Spells you cast from exile this turn cost {X} less to cast, where X is the number of players you attacked. +SVar:TrigDig:DB$ Dig | DigNum$ X | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | StaticAbilities$ ReduceCost,STPlay | RememberObjects$ Remembered | SetChosenNumber$ X | SubAbility$ DBCleanup +SVar:ReduceCost:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Card.wasCastFromExile | Type$ Spell | Activator$ You | Amount$ ChosenNumber | Description$ Spells you cast from exile this turn cost {X} less to cast, where X is the number of players you attacked. SVar:STPlay:Mode$ Continuous | Affected$ Card.IsRemembered+nonLand | EffectZone$ Command | AffectedZone$ Exile | MayPlay$ True | Description$ Until end of turn, you may cast spells from among those exiled cards. -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBResetNum -SVar:DBResetNum:DB$ StoreSVar | SVar$ Y | Type$ Number | Expression$ 0 +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:TriggeredPlayersAttackedTarget$Amount -SVar:Y:Number$0 DeckHints:Keyword$Encore|Myriad Oracle:Whenever you attack, spells you cast from exile this turn cost {X} less to cast, where X is the number of players being attacked. Exile the top X cards of your library. Until end of turn, you may cast spells from among those exiled cards. From cb325996c9710c9fb2de406064ae5057782d5fca Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Mon, 16 Sep 2024 13:34:48 +0800 Subject: [PATCH 02/37] prevent NPE --- forge-gui-mobile/src/forge/itemmanager/views/ImageView.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java index 435d6375790..789c68d2a86 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java @@ -431,10 +431,12 @@ public class ImageView extends ItemView { Map, Pile> piles = new TreeMap<>(); for (ItemInfo itemInfo : group.items) { Comparable key = groupPileBy.fnSort.apply(itemInfo); - if (!piles.containsKey(key)) { + if (key != null && !piles.containsKey(key)) { piles.put(key, new Pile()); } - piles.get(key).items.add(itemInfo); + Pile p = key == null ? null : piles.getOrDefault(key, null); + if (p != null) + p.items.add(itemInfo); } group.piles.clear(); group.piles.addAll(piles.values()); From a63f87e5bee58ccb9a8bec2df6249a4578cc023f Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Mon, 16 Sep 2024 09:58:15 +0200 Subject: [PATCH 03/37] Update all_shall_smolder_in_my_wake.txt (#6155) --- .../res/cardsfolder/a/all_shall_smolder_in_my_wake.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/all_shall_smolder_in_my_wake.txt b/forge-gui/res/cardsfolder/a/all_shall_smolder_in_my_wake.txt index 09762fd1fe4..8516be1e00b 100644 --- a/forge-gui/res/cardsfolder/a/all_shall_smolder_in_my_wake.txt +++ b/forge-gui/res/cardsfolder/a/all_shall_smolder_in_my_wake.txt @@ -2,7 +2,8 @@ Name:All Shall Smolder in My Wake ManaCost:no cost Types:Scheme T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ Ignite | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, destroy up to one target artifact, up to one target enchantment, and up to one target nonbasic land. -SVar:Ignite:DB$ Destroy | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to destroy | SubAbility$ Burn -SVar:Burn:DB$ Destroy | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment to destroy | SubAbility$ Smolder -SVar:Smolder:DB$ Destroy | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land to destroy +SVar:Ignite:DB$ Pump | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to destroy | AILogic$ Destroy | IsCurse$ True | SubAbility$ Burn +SVar:Burn:DB$ Pump | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment to destroy | AILogic$ Destroy | IsCurse$ True | SubAbility$ Smolder +SVar:Smolder:DB$ Pump | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land to destroy | AILogic$ Destroy | IsCurse$ True | SubAbility$ Burninate +SVar:Burninate:DB$ Destroy | Defined$ Targeted Oracle:When you set this scheme in motion, destroy up to one target artifact, up to one target enchantment, and up to one target nonbasic land. From c4d943750cb26810f5d0ea300619b1f8576a7cd6 Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Mon, 16 Sep 2024 16:04:19 +0800 Subject: [PATCH 04/37] fix netplay crash -closes issue #6145 --- .../java/forge/player/PlayerControllerHuman.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index a4f1d9e0f01..8619346af35 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1857,12 +1857,17 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont if (possibleReplacers.size() == 1) { return first; } + final List res = Lists.newArrayListWithCapacity(possibleReplacers.size()); + for (ReplacementEffect r : possibleReplacers) + res.add(r.toString()); String prompt = localizer.getMessage("lblChooseFirstApplyReplacementEffect"); final String firstStr = first.toString(); for (int i = 1; i < possibleReplacers.size(); i++) { // prompt user if there are multiple different options if (!possibleReplacers.get(i).toString().equals(firstStr)) { - return getGui().one(prompt, possibleReplacers); + int index = res.indexOf(getGui().one(prompt, res)); + if (index > -1) + return possibleReplacers.get(index); } } // return first option without prompting if all options are the same @@ -1875,11 +1880,16 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont if (possibleStatics.size() == 1 || !fullControl) { return first; } + final List sts = Lists.newArrayListWithCapacity(possibleStatics.size()); + for (StaticAbility s : possibleStatics) + sts.add(s.toString()); final String firstStr = first.toString(); for (int i = 1; i < possibleStatics.size(); i++) { // prompt user if there are multiple different options if (!possibleStatics.get(i).toString().equals(firstStr)) { - return getGui().one(prompt, possibleStatics); + int index = sts.indexOf(getGui().one(prompt, sts)); + if (index > -1) + return possibleStatics.get(index); } } // return first option without prompting if all options are the same From 6e3c17a2a842e3563222fbe3b48c4510931c0efe Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Mon, 16 Sep 2024 10:17:22 +0200 Subject: [PATCH 05/37] 18 mostly leaked DSK/DSC cards (plus one token) (#6131) --- .../res/cardsfolder/upcoming/barbflare_gremlin.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/bedhead_beastie.txt | 8 ++++++++ .../res/cardsfolder/upcoming/convert_to_slime.txt | 11 +++++++++++ .../res/cardsfolder/upcoming/cracked_skull.txt | 13 +++++++++++++ .../res/cardsfolder/upcoming/deluge_of_doom.txt | 6 ++++++ .../res/cardsfolder/upcoming/dont_make_a_sound.txt | 6 ++++++ .../res/cardsfolder/upcoming/formless_genesis.txt | 9 +++++++++ .../res/cardsfolder/upcoming/gleeful_arsonist.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/into_the_pit.txt | 7 +++++++ .../upcoming/overlord_of_the_balemurk.txt | 10 ++++++++++ .../cardsfolder/upcoming/persistent_constrictor.txt | 9 +++++++++ .../res/cardsfolder/upcoming/possessed_goat.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/seance_board.txt | 9 +++++++++ .../cardsfolder/upcoming/sheltered_by_ghosts.txt | 9 +++++++++ .../res/cardsfolder/upcoming/shroudstomper.txt | 12 ++++++++++++ .../res/cardsfolder/upcoming/suspended_sentence.txt | 7 +++++++ .../res/cardsfolder/upcoming/the_lord_of_pain.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/waltz_of_rage.txt | 13 +++++++++++++ .../c_x_x_shapeshifter_changeling_deathtouch.txt | 7 +++++++ 19 files changed, 172 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/barbflare_gremlin.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/bedhead_beastie.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/convert_to_slime.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/cracked_skull.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/deluge_of_doom.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/dont_make_a_sound.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/formless_genesis.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/gleeful_arsonist.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/into_the_pit.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/overlord_of_the_balemurk.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/persistent_constrictor.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/possessed_goat.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/seance_board.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sheltered_by_ghosts.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/shroudstomper.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/suspended_sentence.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/the_lord_of_pain.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/waltz_of_rage.txt create mode 100644 forge-gui/res/tokenscripts/c_x_x_shapeshifter_changeling_deathtouch.txt diff --git a/forge-gui/res/cardsfolder/upcoming/barbflare_gremlin.txt b/forge-gui/res/cardsfolder/upcoming/barbflare_gremlin.txt new file mode 100644 index 00000000000..ec6c8e3c601 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/barbflare_gremlin.txt @@ -0,0 +1,10 @@ +Name:Barbflare Gremlin +ManaCost:3 R +Types:Creature Gremlin +PT:3/2 +K:First Strike +K:Haste +T:Mode$ TapsForMana | ValidCard$ Land | PresentDefined$ Self | IsPresent$ Card.tapped | Execute$ TrigMana | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever a player taps a land for mana, if CARDNAME is tapped, that player adds one mana of any type that land produced. Then that land deals 1 damage to that player. +SVar:TrigMana:DB$ ManaReflected | ColorOrType$ Type | ReflectProperty$ Produced | Defined$ TriggeredActivator | SubAbility$ DBDealDamage +SVar:DBDamage:DB$ DealDamage | Defined$ TriggeredActivator | DamageSource$ TriggeredCard | NumDmg$ 1 +Oracle:First strike, haste\nWhenever a player taps a land for mana, if Barbflare Gremlin is tapped, that player adds one mana of any type that land produced. Then that land deals 1 damage to that player. diff --git a/forge-gui/res/cardsfolder/upcoming/bedhead_beastie.txt b/forge-gui/res/cardsfolder/upcoming/bedhead_beastie.txt new file mode 100644 index 00000000000..7fa8c49c031 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bedhead_beastie.txt @@ -0,0 +1,8 @@ +Name:Bedhead Beastie +ManaCost:4 R R +Types:Creature Beast +PT:5/6 +K:Menace +K:TypeCycling:Mountain:2 +DeckHas:Ability$Discard +Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nMountaincycling {2} ({2}, Discard this card: Search your library for a Mountain card, reveal it, put it into your hand, then shuffle.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/convert_to_slime.txt b/forge-gui/res/cardsfolder/upcoming/convert_to_slime.txt new file mode 100644 index 00000000000..df52d6c6842 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/convert_to_slime.txt @@ -0,0 +1,11 @@ +Name:Convert to Slime +ManaCost:3 B G +Types:Sorcery +A:SP$ Pump | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to destroy | AILogic$ Destroy | IsCurse$ True | SubAbility$ DBPump1 | SpellDescription$ Destroy up to one target artifact, up to one target creature, and up to one target enchantment. Delirium — Then if there are four or more card types among cards in your graveyard, create an X/X green Ooze token, where X is the total mana value of permanents destroyed this way. +SVar:DBPump1:DB$ Pump | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature to destroy | AILogic$ Destroy | IsCurse$ True | SubAbility$ DBPump2 +SVar:DBPump2:DB$ Pump | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment to destroy | AILogic$ Destroy | IsCurse$ True | SubAbility$ DBDestroy +SVar:DBDestroy:DB$ Destroy | Defined$ Targeted | RememberDestroyed$ True | SubAbility$ DBToken +SVar:DBToken:DB$ Token | Condition$ Delirium | TokenAmount$ 1 | TokenScript$ g_x_x_ooze | TokenOwner$ You | TokenPower$ X | TokenToughness$ X | SubAbility$ DBCleanUp +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Remembered$SumCMC +Oracle:Destroy up to one target artifact, up to one target creature, and up to one target enchantment.\nDelirium — Then if there are four or more card types among cards in your graveyard, create an X/X green Ooze token, where X is the total mana value of permanents destroyed this way. diff --git a/forge-gui/res/cardsfolder/upcoming/cracked_skull.txt b/forge-gui/res/cardsfolder/upcoming/cracked_skull.txt new file mode 100644 index 00000000000..5a429c65f66 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cracked_skull.txt @@ -0,0 +1,13 @@ +Name:Cracked Skull +ManaCost:2 B +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature | AILogic$ Curse +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters, look at target player's hand. You may choose a nonland card from it. That player discards that card. +SVar:TrigDiscard:DB$ Discard | ValidTgts$ Player | Mode$ RevealYouChoose | Optional$ True | DiscardValid$ Card.nonLand | DiscardValidDesc$ nonland card +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddSVar$ MortalDestroy +SVar:MortalDestroy:SVar:DestroyWhenDamaged:True +T:Mode$ DamageDoneOnce | ValidTarget$ Creature.EnchantedBy | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ When enchanted creature is dealt damage, destroy it. +SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredTargetLKICopy +SVar:NonStackingAttachEffect:True +Oracle:Enchant creature\nWhen Cracked Skull enters, look at target player's hand. You may choose a nonland card from it. That player discards that card.\nWhen enchanted creature is dealt damage, destroy it. diff --git a/forge-gui/res/cardsfolder/upcoming/deluge_of_doom.txt b/forge-gui/res/cardsfolder/upcoming/deluge_of_doom.txt new file mode 100644 index 00000000000..3dce1bc998c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/deluge_of_doom.txt @@ -0,0 +1,6 @@ +Name:Deluge of Doom +ManaCost:2 B +Types:Sorcery +A:SP$ PumpAll | ValidCards$ Creature | NumAtt$ -X | NumDef$ -X | SpellDescription$ All creatures get -X/-X until end of turn, where X is the number of card types among cards in your graveyard. +SVar:X:Count$ValidGraveyard Card.YouOwn$CardTypes +Oracle:All creatures get -X/-X until end of turn, where X is the number of card types among cards in your graveyard. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/dont_make_a_sound.txt b/forge-gui/res/cardsfolder/upcoming/dont_make_a_sound.txt new file mode 100644 index 00000000000..97138bd0bda --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dont_make_a_sound.txt @@ -0,0 +1,6 @@ +Name:Don't Make a Sound +ManaCost:1 U +Types:Instant +A:SP$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 2 | UnlessResolveSubs$ WhenPaid | SubAbility$ DBSurveil | SpellDescription$ Counter target spell unless its controller pays {2}. If they do, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) +SVar:TrigSurveil:DB$ Surveil | Amount$ 2 +Oracle:Counter target spell unless its controller pays {2}. If they do, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) diff --git a/forge-gui/res/cardsfolder/upcoming/formless_genesis.txt b/forge-gui/res/cardsfolder/upcoming/formless_genesis.txt new file mode 100644 index 00000000000..7da27839954 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/formless_genesis.txt @@ -0,0 +1,9 @@ +Name:Formless Genesis +ManaCost:2 G +Types:Kindred Sorcery Shapeshifter +K:Changeling +A:SP$ Token | TokenAmount$ 1 | TokenScript$ c_x_x_shapeshifter_changeling_deathtouch | TokenOwner$ You | TokenPower$ X | TokenToughness$ X | SpellDescription$ Create an X/X colorless Shapeshifter creature token with changeling and deathtouch, where X is the number of land cards in your graveyard. +K:Retrace +SVar:X:Count$TypeInYourYard.Land +DeckHas:Ability$Token +Oracle:Changeling (This card is every creature type.)\nCreate an X/X colorless Shapeshifter creature token with changeling and deathtouch, where X is the number of land cards in your graveyard.\nRetrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/gleeful_arsonist.txt b/forge-gui/res/cardsfolder/upcoming/gleeful_arsonist.txt new file mode 100644 index 00000000000..e1ab6cb5198 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gleeful_arsonist.txt @@ -0,0 +1,9 @@ +Name:Gleeful Arsonist +ManaCost:2 R +Types:Creature Human Wizard +PT:1/2 +T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever an opponent casts a noncreature spell, CARDNAME deals damage equal to its power to that player. +SVar:TrigDealDamage:DB$ DealDamage | Defined$ TriggeredActivator | NumDmg$ X +K:Undying +SVar:X:Count$CardPower +Oracle:Whenever an opponent casts a noncreature spell, Gleeful Arsonist deals damage equal to its power to that player.\nUndying (When this creature dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.) diff --git a/forge-gui/res/cardsfolder/upcoming/into_the_pit.txt b/forge-gui/res/cardsfolder/upcoming/into_the_pit.txt new file mode 100644 index 00000000000..51eededc041 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/into_the_pit.txt @@ -0,0 +1,7 @@ +Name:Into the Pit +ManaCost:2 B +Types:Enchantment +S:Mode$ Continuous | Affected$ Card.TopLibrary+YouOwn | AffectedZone$ Library | MayLookAt$ You | Description$ You may look at the top card of your library any time. +S:Mode$ Continuous | Affected$ Card.TopLibrary+YouOwn+nonLand | AffectedZone$ Library | MayPlay$ True | RaiseCost$ Sac<1/Permanent.nonLand/nonland permanent> | Description$ You may cast spells from the top of your library by sacrificing a nonland permanent in addition to paying their other costs. +SVar:NonStackingEffect:True +Oracle:You may look at the top card of your library any time.\nYou may cast spells from the top of your library by sacrificing a nonland permanent in addition to paying their other costs. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/overlord_of_the_balemurk.txt b/forge-gui/res/cardsfolder/upcoming/overlord_of_the_balemurk.txt new file mode 100644 index 00000000000..ffc60130019 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/overlord_of_the_balemurk.txt @@ -0,0 +1,10 @@ +Name:Overlord of the Balemurk +ManaCost:3 B B +Types:Enchantment Creature Avatar Horror +PT:5/5 +K:Impending:5:1 B +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ Whenever CARDNAME enters or attacks, mill four cards, then you may return a non-Avatar creature card or a planeswalker card from your graveyard to your hand. +T:Mode$ Attacks | ValidCard$ Card.Self | Secondary$ True | Execute$ TrigMill | TriggerDescription$ Whenever CARDNAME enters or attacks, mill four cards, then you may return a non-Avatar creature card or a planeswalker card from your graveyard to your hand. +SVar:TrigMill:DB$ Mill | NumCards$ 4 | SubAbility$ DBChangeZone +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ChangeType$ Creature.nonAvatar+YouOwn,Planeswalker.YouOwn | Hidden$ True | Optional$ True +Oracle:Impending 5—{1}{B} (If you cast this spell for its impending cost, it enters with five time counters and isn't a creature until the last is removed. At the beginning of your end step, remove a time counter from it.)\nWhenever Overlord of the Balemurk enters or attacks, mill four cards, then you may return a non-Avatar creature card or a planeswalker card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/persistent_constrictor.txt b/forge-gui/res/cardsfolder/upcoming/persistent_constrictor.txt new file mode 100644 index 00000000000..8994eb253bf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/persistent_constrictor.txt @@ -0,0 +1,9 @@ +Name:Persistent Constrictor +ManaCost:4 B +Types:Creature Zombie Snake +PT:5/3 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | Execute$ TrigLoseLife | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each opponent's upkeep, they lose 1 life and you put a -1/-1 counter on up to one target creature they control. +SVar:TrigLoseLife:DB$ LoseLife | LifeAmount$ 1 | Defined$ TriggeredPlayer | SubAbility$ DBPutCounter +SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature they control | CounterType$ M1M1 | CounterNum$ 1 | TargetsWithDefinedController$ TriggeredPlayer +K:Persist +Oracle:At the beginning of each opponent's upkeep, they lose 1 life and you put a -1/-1 counter on up to one target creature they control.\nPersist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/possessed_goat.txt b/forge-gui/res/cardsfolder/upcoming/possessed_goat.txt new file mode 100644 index 00000000000..3917abd9d9d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/possessed_goat.txt @@ -0,0 +1,7 @@ +Name:Possessed Goat +ManaCost:W +Types:Creature Goat +PT:1/1 +A:AB$ PutCounter | Cost$ 3 Discard<1/Card> | Defined$ Self | CounterType$ P1P1 | CounterNum$ 3 | SubAbility$ DBAnimate | GameActivationLimit$ 1 | SpellDescription$ Put three +1/+1 counters on CARDNAME and it becomes a black Demon in addition to its other colors and types. Activate only once. +SVar:DBAnimate:DB$ Animate | Defined$ Self | Types$ Demon | Colors$ Black | Duration$ Permanent +Oracle:{3}, Discard a card: Put three +1/+1 counters on Possessed Goat and it becomes a black Demon in addition to its other colors and types. Activate only once. diff --git a/forge-gui/res/cardsfolder/upcoming/seance_board.txt b/forge-gui/res/cardsfolder/upcoming/seance_board.txt new file mode 100644 index 00000000000..d6b49833d0d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/seance_board.txt @@ -0,0 +1,9 @@ +Name:Séance Board +ManaCost:2 +Types:Artifact +T:Mode$ Phase | Phase$ End of Turn | CheckSVar$ X | SVarCompare$ GE1 | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Morbid — At the beginning of each end step, if a creature died this turn, put a soul counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ SOUL | CounterNum$ 1 +A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ Y | RestrictValid$ Spell.Instant,Spell.Sorcery,Spell.Demon,Spell.Spirit | SpellDescription$ Add X mana of any one color, where X is the number of soul counters on CARDNAME. Spend this mana only to cast instant, sorcery, Demon, and Spirit spells. +SVar:X:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Y:Count$CardCounters.SOUL +Oracle:Morbid — At the beginning of each end step, if a creature died this turn, put a soul counter on Séance Board.\n{T}: Add X mana of any one color, where X is the number of soul counters on Séance Board. Spend this mana only to cast instant, sorcery, Demon, and Spirit spells. diff --git a/forge-gui/res/cardsfolder/upcoming/sheltered_by_ghosts.txt b/forge-gui/res/cardsfolder/upcoming/sheltered_by_ghosts.txt new file mode 100644 index 00000000000..b1219aeb2b2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sheltered_by_ghosts.txt @@ -0,0 +1,9 @@ +Name:Sheltered by Ghosts +ManaCost:1 W +Types:Enchantment Aura +K:Enchant creature you control +A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | AILogic$ Pump +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters, exile target nonland permanent an opponent controls until CARDNAME leaves the battlefield. +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | Duration$ UntilHostLeavesPlay +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddKeyword$ Lifelink & Ward:2 | Description$ Enchanted creature gets +1/+0 and has lifelink and ward {2}. +Oracle:Enchant creature you control\nWhen Sheltered by Ghosts enters, exile target nonland permanent an opponent controls until Sheltered by Ghosts leaves the battlefield.\nEnchanted creature gets +1/+0 and has lifelink and ward {2}. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/shroudstomper.txt b/forge-gui/res/cardsfolder/upcoming/shroudstomper.txt new file mode 100644 index 00000000000..6c84fd3c4df --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shroudstomper.txt @@ -0,0 +1,12 @@ +Name:Shroudstomper +ManaCost:3 W W B B +Types:Creature Elemental +PT:5/5 +K:Deathtouch +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME enters or attacks, each opponent loses 2 life. You gain 2 life and draw a card. +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigLoseLife | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters or attacks, each opponent loses 2 life. You gain 2 life and draw a card. +SVar:TrigLoseLife:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw +SVar:HasAttackEffect:TRUE +Oracle:Deathtouch\nWhenever Shroudstomper enters or attacks, each opponent loses 2 life. You gain 2 life and draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/suspended_sentence.txt b/forge-gui/res/cardsfolder/upcoming/suspended_sentence.txt new file mode 100644 index 00000000000..9f8d0e0ed1d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/suspended_sentence.txt @@ -0,0 +1,7 @@ +Name:Suspended Sentence +ManaCost:3 B +Types:Instant +A:SP$ Destroy | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | SubAbility$ DBLoseLife | SpellDescription$ Destroy target creature an opponent controls. That player loses 3 life. Exile CARDNAME with three time counters on it. +SVar:DBLoseLife:DB$ LoseLife | Defined$ TargetedController | LifeAmount$ 3 | SubAbility$ DBChange +SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | WithCountersType$ TIME | WithCountersAmount$ 3 +Oracle:Destroy target creature an opponent controls. That player loses 3 life. Exile Suspended Sentence with three time counters on it.\nSuspend 3—{1}{B} (Rather than cast this card from your hand, pay {1}{B} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, you may cast it without paying its mana cost.) diff --git a/forge-gui/res/cardsfolder/upcoming/the_lord_of_pain.txt b/forge-gui/res/cardsfolder/upcoming/the_lord_of_pain.txt new file mode 100644 index 00000000000..29b61cad008 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_lord_of_pain.txt @@ -0,0 +1,10 @@ +Name:The Lord of Pain +ManaCost:3 B R +Types:Legendary Creature Human Assassin +PT:5/5 +K:Menace +S:Mode$ CantGainLife | ValidPlayer$ Player.Opponent | Description$ Your opponents can't gain life. +T:Mode$ SpellCast | ValidActivatingPlayer$ Player | ActivatorThisTurnCast$ EQ1 | Execute$ TrigDealDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts their first spell each turn, choose another target player. CARDNAME deals damage equal to that spell's mana value to the chosen player. +SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Player.!TriggeredActivator | NumDmg$ X +SVar:X:TriggeredStackInstance$CardManaCostLKI +Oracle:Menace\nYour opponents can't gain life.\nWhenever a player casts their first spell each turn, choose another target player. The Lord of Pain deals damage equal to that spell's mana value to the chosen player. diff --git a/forge-gui/res/cardsfolder/upcoming/waltz_of_rage.txt b/forge-gui/res/cardsfolder/upcoming/waltz_of_rage.txt new file mode 100644 index 00000000000..809c63ef855 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/waltz_of_rage.txt @@ -0,0 +1,13 @@ +Name:Waltz of Rage +ManaCost:3 R R +Types:Sorcery +A:SP$ Pump | ValidTgts$ Creature.YouCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature you control | SubAbility$ IgnitionDamage | StackDescription$ None | SpellDescription$ Target creature you control deals damage equal to its power to each other creature. Until end of turn, whenever a creature you control dies, exile the top card of your library. You may play it until the end of your next turn. +SVar:IgnitionDamage:DB$ DamageAll | ValidCards$ Creature.NotDefinedTargeted | NumDmg$ X | DamageSource$ ParentTarget | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | Triggers$ TrigDie +SVar:TrigDie:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Command | Execute$ TrigDig | TriggerDescription$ Whenever a creature you control dies, exile the top card of your library. You may play it until the end of your next turn. +SVar:TrigDig:DB$ Dig | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ STPlay | SubAbility$ DBCleanup | ForgetOnMoved$ Exile | Duration$ UntilTheEndOfYourNextTurn +SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play that card until the end of your next turn. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:ParentTargeted$CardPower +Oracle:Target creature you control deals damage equal to its power to each other creature. Until end of turn, whenever a creature you control dies, exile the top card of your library. You may play it until the end of your next turn. diff --git a/forge-gui/res/tokenscripts/c_x_x_shapeshifter_changeling_deathtouch.txt b/forge-gui/res/tokenscripts/c_x_x_shapeshifter_changeling_deathtouch.txt new file mode 100644 index 00000000000..4d99d39912b --- /dev/null +++ b/forge-gui/res/tokenscripts/c_x_x_shapeshifter_changeling_deathtouch.txt @@ -0,0 +1,7 @@ +Name:Shapeshifter Token +ManaCost:no cost +Types:Creature Shapeshifter +PT:*/* +K:Changeling +K:Deathtouch +Oracle:Changeling, deathtouch \ No newline at end of file From 7b9e2a6735126da537858b373dd9e7cc609e704e Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Mon, 16 Sep 2024 12:36:31 +0200 Subject: [PATCH 06/37] ManifestDread as separate Effect (#6151) --- .../src/main/java/forge/ai/SpellApiToAi.java | 1 + .../main/java/forge/game/ability/ApiType.java | 1 + .../ability/effects/ManifestBaseEffect.java | 122 ++++++++---------- .../ability/effects/ManifestDreadEffect.java | 41 ++++++ .../game/ability/effects/ManifestEffect.java | 3 +- .../game/trigger/TriggerManifestDread.java | 35 +++++ .../java/forge/game/trigger/TriggerType.java | 1 + .../cardsfolder/upcoming/abhorrent_oculus.txt | 2 +- .../cardsfolder/upcoming/bashful_beastie.txt | 2 +- .../upcoming/break_down_the_door.txt | 2 +- .../upcoming/conductive_machete.txt | 2 +- .../cardsfolder/upcoming/curator_beastie.txt | 2 +- .../upcoming/cursed_windbreaker.txt | 2 +- .../cardsfolder/upcoming/defiant_survivor.txt | 2 +- .../cardsfolder/upcoming/disturbing_mirth.txt | 2 +- .../upcoming/fear_of_impostors.txt | 2 +- .../upcoming/glitch_interpreter.txt | 2 +- .../cardsfolder/upcoming/growing_dread.txt | 2 +- .../upcoming/hauntwoods_shrieker.txt | 2 +- .../cardsfolder/upcoming/innocuous_rat.txt | 2 +- .../res/cardsfolder/upcoming/killers_mask.txt | 2 +- .../upcoming/stay_hidden_stay_silent.txt | 2 +- .../upcoming/they_came_from_the_pipes.txt | 2 +- .../upcoming/threats_around_every_corner.txt | 2 +- .../cardsfolder/upcoming/turn_inside_out.txt | 2 +- .../cardsfolder/upcoming/twist_reality.txt | 2 +- .../cardsfolder/upcoming/under_the_skin.txt | 2 +- .../cardsfolder/upcoming/unsettling_twins.txt | 2 +- .../cardsfolder/upcoming/unwanted_remake.txt | 2 +- .../upcoming/valgavoths_onslaught.txt | 2 +- .../upcoming/zimone_mystery_unraveler.txt | 2 +- 31 files changed, 161 insertions(+), 91 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/ability/effects/ManifestDreadEffect.java create mode 100644 forge-game/src/main/java/forge/game/trigger/TriggerManifestDread.java diff --git a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java index abb619a974c..6c56786b187 100644 --- a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java @@ -115,6 +115,7 @@ public enum SpellApiToAi { .put(ApiType.Mana, ManaAi.class) .put(ApiType.ManaReflected, CannotPlayAi.class) .put(ApiType.Manifest, ManifestAi.class) + .put(ApiType.ManifestDread, ManifestAi.class) .put(ApiType.Meld, MeldAi.class) .put(ApiType.Mill, MillAi.class) .put(ApiType.MoveCounter, CountersMoveAi.class) diff --git a/forge-game/src/main/java/forge/game/ability/ApiType.java b/forge-game/src/main/java/forge/game/ability/ApiType.java index 11bc98b5d96..0ba67421827 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -116,6 +116,7 @@ public enum ApiType { Mana (ManaEffect.class), ManaReflected (ManaReflectedEffect.class), Manifest (ManifestEffect.class), + ManifestDread (ManifestDreadEffect.class), Meld (MeldEffect.class), Mill (MillEffect.class), MoveCounter (CountersMoveEffect.class), diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManifestBaseEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManifestBaseEffect.java index 088ac6babb8..ec9eb7bbd5c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManifestBaseEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManifestBaseEffect.java @@ -22,79 +22,69 @@ public abstract class ManifestBaseEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card source = sa.getHostCard(); - final Player activator = sa.getActivatingPlayer(); - final Game game = source.getGame(); // Usually a number leaving possibility for X, Sacrifice X land: Manifest X creatures. final int amount = sa.hasParam("Amount") ? AbilityUtils.calculateAmount(source, sa.getParam("Amount"), sa) : 1; - final int times = sa.hasParam("Times") ? AbilityUtils.calculateAmount(source, sa.getParam("Times"), sa) : 1; - for (int i = 0; i < times; i++) { - for (final Player p : getTargetPlayers(sa, "DefinedPlayer")) { - CardCollection tgtCards; - Card toGrave = null; - boolean fromLibrary = false; - if (sa.hasParam("Choices") || sa.hasParam("ChoiceZone")) { - ZoneType choiceZone = ZoneType.Hand; - if (sa.hasParam("ChoiceZone")) { - choiceZone = ZoneType.smartValueOf(sa.getParam("ChoiceZone")); - fromLibrary = choiceZone.equals(ZoneType.Library); - } - CardCollectionView choices = p.getCardsIn(choiceZone); - if (sa.hasParam("Choices")) { - choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, source, sa); - } - if (choices.isEmpty()) { - continue; - } + for (final Player p : getTargetPlayers(sa, "DefinedPlayer")) { + manifestLoop(sa, p, amount); + } + } - String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : getDefaultMessage() + " "; + protected void manifestLoop(SpellAbility sa, Player p, final int amount) { - tgtCards = new CardCollection(p.getController().chooseCardsForEffect(choices, sa, title, amount, amount, false, null)); - } else if (sa.hasParam("Dread")) { - tgtCards = p.getTopXCardsFromLibrary(2); - if (!tgtCards.isEmpty()) { - Card manifest = p.getController().chooseSingleEntityForEffect(tgtCards, sa, getDefaultMessage(), null); - tgtCards.remove(manifest); - toGrave = tgtCards.isEmpty() ? null : tgtCards.getFirst(); - tgtCards = new CardCollection(manifest); - } - fromLibrary = true; - } else if ("TopOfLibrary".equals(sa.getParamOrDefault("Defined", "TopOfLibrary"))) { - tgtCards = p.getTopXCardsFromLibrary(amount); - fromLibrary = true; - } else { - tgtCards = getTargetCards(sa); - if (Iterables.all(tgtCards, CardPredicates.inZone(ZoneType.Library))) { - fromLibrary = true; - } - } + final Card source = sa.getHostCard(); + final Player activator = sa.getActivatingPlayer(); + final Game game = source.getGame(); - if (sa.hasParam("Shuffle")) { - CardLists.shuffle(tgtCards); - } - - if (fromLibrary) { - for (Card c : tgtCards) { - // CR 701.34d If an effect instructs a player to manifest multiple cards from their library, those cards are manifested one at a time. - Map moveParams = AbilityKey.newMap(); - CardZoneTable triggerList = AbilityKey.addCardZoneTableParams(moveParams, sa); - internalEffect(c, p, sa, moveParams); - if (sa.hasParam("Dread") && toGrave != null) { - game.getAction().moveToGraveyard(toGrave, sa, moveParams); - toGrave = null; - } - triggerList.triggerChangesZoneAll(game, sa); - } - } else { - // manifest from other zones should be done at the same time - Map moveParams = AbilityKey.newMap(); - CardZoneTable triggerList = AbilityKey.addCardZoneTableParams(moveParams, sa); - for (Card c : tgtCards) { - internalEffect(c, p, sa, moveParams); - } - triggerList.triggerChangesZoneAll(game, sa); - } + CardCollection tgtCards; + boolean fromLibrary = false; + if (sa.hasParam("Choices") || sa.hasParam("ChoiceZone")) { + ZoneType choiceZone = ZoneType.Hand; + if (sa.hasParam("ChoiceZone")) { + choiceZone = ZoneType.smartValueOf(sa.getParam("ChoiceZone")); + fromLibrary = choiceZone.equals(ZoneType.Library); } + CardCollectionView choices = p.getCardsIn(choiceZone); + if (sa.hasParam("Choices")) { + choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, source, sa); + } + if (choices.isEmpty()) { + return; + } + + String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : getDefaultMessage() + " "; + + tgtCards = new CardCollection(p.getController().chooseCardsForEffect(choices, sa, title, amount, amount, false, null)); + } else if ("TopOfLibrary".equals(sa.getParamOrDefault("Defined", "TopOfLibrary"))) { + tgtCards = p.getTopXCardsFromLibrary(amount); + fromLibrary = true; + } else { + tgtCards = getTargetCards(sa); + if (Iterables.all(tgtCards, CardPredicates.inZone(ZoneType.Library))) { + fromLibrary = true; + } + } + + if (sa.hasParam("Shuffle")) { + CardLists.shuffle(tgtCards); + } + + if (fromLibrary) { + for (Card c : tgtCards) { + // CR 701.34d If an effect instructs a player to manifest multiple cards from their library, those cards are manifested one at a time. + Map moveParams = AbilityKey.newMap(); + CardZoneTable triggerList = AbilityKey.addCardZoneTableParams(moveParams, sa); + internalEffect(c, p, sa, moveParams); + triggerList.triggerChangesZoneAll(game, sa); + } + } else { + // manifest from other zones should be done at the same time + Map moveParams = AbilityKey.newMap(); + CardZoneTable triggerList = AbilityKey.addCardZoneTableParams(moveParams, sa); + for (Card c : tgtCards) { + internalEffect(c, p, sa, moveParams); + } + triggerList.triggerChangesZoneAll(game, sa); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManifestDreadEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManifestDreadEffect.java new file mode 100644 index 00000000000..9ab355188b4 --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/ManifestDreadEffect.java @@ -0,0 +1,41 @@ +package forge.game.ability.effects; + +import java.util.Map; + +import forge.game.Game; +import forge.game.ability.AbilityKey; +import forge.game.card.Card; +import forge.game.card.CardCollection; +import forge.game.card.CardZoneTable; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; +import forge.game.trigger.TriggerType; + +public class ManifestDreadEffect extends ManifestEffect { + @Override + protected void manifestLoop(SpellAbility sa, Player p, final int amount) { + final Game game = p.getGame(); + for (int i = 0; i < amount; i++) { + CardCollection tgtCards = p.getTopXCardsFromLibrary(2); + Card manifest = null; + Card toGrave = null; + if (!tgtCards.isEmpty()) { + manifest = p.getController().chooseSingleEntityForEffect(tgtCards, sa, getDefaultMessage(), null); + tgtCards.remove(manifest); + toGrave = tgtCards.isEmpty() ? null : tgtCards.getFirst(); + + // CR 701.34d If an effect instructs a player to manifest multiple cards from their library, those cards are manifested one at a time. + Map moveParams = AbilityKey.newMap(); + CardZoneTable triggerList = AbilityKey.addCardZoneTableParams(moveParams, sa); + internalEffect(manifest, p, sa, moveParams); + if (toGrave != null) { + toGrave = game.getAction().moveToGraveyard(toGrave, sa, moveParams); + } + triggerList.triggerChangesZoneAll(game, sa); + } + Map runParams = AbilityKey.mapFromPlayer(p); + runParams.put(AbilityKey.Card, toGrave); + game.getTriggerHandler().runTrigger(TriggerType.ManifestDread, runParams, true); + } + } +} diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java index b24ef311bc8..209d97e8b73 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java @@ -9,10 +9,11 @@ import forge.game.spellability.SpellAbility; import forge.util.Localizer; public class ManifestEffect extends ManifestBaseEffect { - + @Override protected String getDefaultMessage() { return Localizer.getInstance().getMessage("lblChooseCardToManifest"); } + @Override protected Card internalEffect(Card c, Player p, SpellAbility sa, Map moveParams) { final Card source = sa.getHostCard(); Card rem = c.manifest(p, sa, moveParams); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerManifestDread.java b/forge-game/src/main/java/forge/game/trigger/TriggerManifestDread.java new file mode 100644 index 00000000000..da4598c254c --- /dev/null +++ b/forge-game/src/main/java/forge/game/trigger/TriggerManifestDread.java @@ -0,0 +1,35 @@ +package forge.game.trigger; + +import java.util.Map; + +import forge.game.ability.AbilityKey; +import forge.game.card.Card; +import forge.game.spellability.SpellAbility; + +public class TriggerManifestDread extends Trigger { + + public TriggerManifestDread(Map params, Card host, boolean intrinsic) { + super(params, host, intrinsic); + } + + @Override + public boolean performTest(Map runParams) { + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; + } + return true; + } + + @Override + public void setTriggeringObjects(SpellAbility sa, Map runParams) { + sa.setTriggeringObject(AbilityKey.NewCard, runParams.get(AbilityKey.Card)); + + } + + @Override + public String getImportantStackObjects(SpellAbility sa) { + // TODO Auto-generated method stub + return ""; + } + +} diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index f97dd52fef8..2db1f4c9d77 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -97,6 +97,7 @@ public enum TriggerType { LosesGame(TriggerLosesGame.class), ManaAdded(TriggerManaAdded.class), ManaExpend(TriggerManaExpend.class), + ManifestDread(TriggerManifestDread.class), Mentored(TriggerMentored.class), Milled(TriggerMilled.class), MilledOnce(TriggerMilledOnce.class), diff --git a/forge-gui/res/cardsfolder/upcoming/abhorrent_oculus.txt b/forge-gui/res/cardsfolder/upcoming/abhorrent_oculus.txt index 474b57d5fb3..10f056fcba6 100644 --- a/forge-gui/res/cardsfolder/upcoming/abhorrent_oculus.txt +++ b/forge-gui/res/cardsfolder/upcoming/abhorrent_oculus.txt @@ -5,5 +5,5 @@ PT:5/5 A:SP$ PermanentCreature | Cost$ 2 U ExileFromGrave<6/Card> K:Flying T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDread | TriggerDescription$ At the beginning of each opponent's upkeep, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature, and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) -SVar:TrigDread:DB$ Manifest | Dread$ True +SVar:TrigDread:DB$ ManifestDread Oracle:As an additional cost to cast this spell, exile six cards from your graveyard.\nFlying\nAt the beginning of each opponent's upkeep, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature, and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/bashful_beastie.txt b/forge-gui/res/cardsfolder/upcoming/bashful_beastie.txt index 6eaa13fbcff..2d7a0dd59c0 100644 --- a/forge-gui/res/cardsfolder/upcoming/bashful_beastie.txt +++ b/forge-gui/res/cardsfolder/upcoming/bashful_beastie.txt @@ -3,5 +3,5 @@ ManaCost:4 G Types:Creature Beast PT:5/4 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDread | TriggerDescription$ When CARDNAME dies, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) -SVar:TrigDread:DB$ Manifest | Dread$ True | Defined$ You +SVar:TrigDread:DB$ ManifestDread Oracle:When Bashful Beastie dies, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) diff --git a/forge-gui/res/cardsfolder/upcoming/break_down_the_door.txt b/forge-gui/res/cardsfolder/upcoming/break_down_the_door.txt index 922b4cad445..cd264639e0f 100644 --- a/forge-gui/res/cardsfolder/upcoming/break_down_the_door.txt +++ b/forge-gui/res/cardsfolder/upcoming/break_down_the_door.txt @@ -4,5 +4,5 @@ Types:Instant A:SP$ Charm | CharmNum$ 1 | Choices$ DBExileArtifact,DBExileEnchantment,DBDread SVar:DBExileArtifact:DB$ ChangeZone | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target artifact. SVar:DBExileEnchantment:DB$ ChangeZone | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target enchantment. -SVar:DBDread:DB$ Manifest | Dread$ True | SpellDescription$ Manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) +SVar:DBDread:DB$ ManifestDread | SpellDescription$ Manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) Oracle:Choose one —\n• Exile target artifact.\n• Exile target enchantment.\n• Manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) diff --git a/forge-gui/res/cardsfolder/upcoming/conductive_machete.txt b/forge-gui/res/cardsfolder/upcoming/conductive_machete.txt index 936683553dd..71c8490cb96 100644 --- a/forge-gui/res/cardsfolder/upcoming/conductive_machete.txt +++ b/forge-gui/res/cardsfolder/upcoming/conductive_machete.txt @@ -2,7 +2,7 @@ Name:Conductive Machete ManaCost:4 Types:Artifact Equipment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDread | TriggerDescription$ When CARDNAME enters, manifest dread, then attach CARDNAME to that creature. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) -SVar:TrigDread:DB$ Manifest | Dread$ True | Defined$ You | RememberManifested$ True | SubAbility$ DBAttach +SVar:TrigDread:DB$ ManifestDread | RememberManifested$ True | SubAbility$ DBAttach SVar:DBAttach:DB$ Attach | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 1 | Description$ Equipped creature gets +2/+1. diff --git a/forge-gui/res/cardsfolder/upcoming/curator_beastie.txt b/forge-gui/res/cardsfolder/upcoming/curator_beastie.txt index 75f37ca7466..fc6e12ab5a4 100644 --- a/forge-gui/res/cardsfolder/upcoming/curator_beastie.txt +++ b/forge-gui/res/cardsfolder/upcoming/curator_beastie.txt @@ -7,6 +7,6 @@ K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.Colorless+ SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 2 | SpellDescription$ Colorless creatures you control enter with two additional +1/+1 counters on them. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDread | TriggerDescription$ Whenever CARDNAME enters or attacks, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) T:Mode$ Attacks | ValidCard$ Card.Self | Secondary$ True | Execute$ TrigDread | TriggerDescription$ Whenever CARDNAME enters or attacks, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) -SVar:TrigDread:DB$ Manifest | Dread$ True +SVar:TrigDread:DB$ ManifestDread DeckHas:Ability$Counters Oracle:Reach\nColorless creatures you control enter with two additional +1/+1 counters on them.\nWhenever Curator Beastie enters or attacks, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) diff --git a/forge-gui/res/cardsfolder/upcoming/cursed_windbreaker.txt b/forge-gui/res/cardsfolder/upcoming/cursed_windbreaker.txt index f28e4926cb8..bc03d481b09 100644 --- a/forge-gui/res/cardsfolder/upcoming/cursed_windbreaker.txt +++ b/forge-gui/res/cardsfolder/upcoming/cursed_windbreaker.txt @@ -2,7 +2,7 @@ Name:Cursed Windbreaker ManaCost:2 U Types:Artifact Equipment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDread | TriggerDescription$ When CARDNAME enters, manifest dread, then attach CARDNAME to that creature. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) -SVar:TrigDread:DB$ Manifest | Dread$ True | Defined$ You | RememberManifested$ True | SubAbility$ DBAttach +SVar:TrigDread:DB$ ManifestDread | RememberManifested$ True | SubAbility$ DBAttach SVar:DBAttach:DB$ Attach | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Flying | Description$ Equipped creature has flying. diff --git a/forge-gui/res/cardsfolder/upcoming/defiant_survivor.txt b/forge-gui/res/cardsfolder/upcoming/defiant_survivor.txt index cbb94052ca4..4e7f6e90c25 100644 --- a/forge-gui/res/cardsfolder/upcoming/defiant_survivor.txt +++ b/forge-gui/res/cardsfolder/upcoming/defiant_survivor.txt @@ -3,5 +3,5 @@ Types:Creature Human Survivor ManaCost:2 G PT:3/2 T:Mode$ Phase | Phase$ Main2 | ValidPlayer$ You | PresentDefined$ Self | IsPresent$ Card.tapped | TriggerZones$ Battlefield | Execute$ TrigDread | TriggerDescription$ Survival — At the beginning of your second main phase, if CARDNAME is tapped, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) -SVar:TrigDread:DB$ Manifest | Dread$ True +SVar:TrigDread:DB$ ManifestDread Oracle:Survival — At the beginning of your second main phase, if Defiant Survivor is tapped, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/disturbing_mirth.txt b/forge-gui/res/cardsfolder/upcoming/disturbing_mirth.txt index 6a0256da67a..3a90a43caf5 100644 --- a/forge-gui/res/cardsfolder/upcoming/disturbing_mirth.txt +++ b/forge-gui/res/cardsfolder/upcoming/disturbing_mirth.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters, you may sacrifice another enchantment or creature. If you do, draw two cards. SVar:TrigDraw:AB$ Draw | Cost$ Sac<1/Enchantment.Other,Creature.Other/another enchantment or creature> | NumCards$ 2 T:Mode$ Sacrificed | ValidPlayer$ You | ValidCard$ Card.Self | Execute$ TrigDread | TriggerZones$ Battlefield | TriggerDescription$ When you sacrifice CARDNAME, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) -SVar:TrigDread:DB$ Manifest | Dread$ True | Defined$ You +SVar:TrigDread:DB$ ManifestDread DeckHas:Ability$Sacrifice Oracle:When Disturbing Mirth enters, you may sacrifice another enchantment or creature. If you do, draw two cards.\nWhen you sacrifice Disturbing Mirth, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) diff --git a/forge-gui/res/cardsfolder/upcoming/fear_of_impostors.txt b/forge-gui/res/cardsfolder/upcoming/fear_of_impostors.txt index 3a00c86c909..2c83a907c33 100644 --- a/forge-gui/res/cardsfolder/upcoming/fear_of_impostors.txt +++ b/forge-gui/res/cardsfolder/upcoming/fear_of_impostors.txt @@ -5,5 +5,5 @@ PT:3/2 K:Flash T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigCounter | TriggerDescription$ When CARDNAME enters, counter target spell. Its controller manifests dread. (That player looks at the top two cards of their library, then puts one onto the battlefield face down as a 2/2 creature and the other into their graveyard. If it's a creature card, it can be turned face up any time for its mana cost.) SVar:TrigCounter:DB$ Counter | TargetType$ Spell | ValidTgts$ Card | SubAbility$ DBDread | TgtPrompt$ Select target spell -SVar:DBDread:DB$ Manifest | Dread$ True | Defined$ TargetedController +SVar:DBDread:DB$ ManifestDread | DefinedPlayer$ TargetedController Oracle:Flash\nWhen Fear of Impostors enters, counter target spell. Its controller manifests dread. (That player looks at the top two cards of their library, then puts one onto the battlefield face down as a 2/2 creature and the other into their graveyard. If it's a creature card, it can be turned face up any time for its mana cost.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/glitch_interpreter.txt b/forge-gui/res/cardsfolder/upcoming/glitch_interpreter.txt index 3c37f1b1a4b..a6c48738b0d 100644 --- a/forge-gui/res/cardsfolder/upcoming/glitch_interpreter.txt +++ b/forge-gui/res/cardsfolder/upcoming/glitch_interpreter.txt @@ -4,7 +4,7 @@ Types:Creature Human Wizard PT:2/3 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | IsPresent$ Permanent.faceDown+YouCtrl | PresentCompare$ EQ0 | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters, if you control no face-down permanents, return CARDNAME to its owner's hand and manifest dread. SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBDread -SVar:DBDread:DB$ Manifest | Dread$ True +SVar:DBDread:DB$ ManifestDread T:Mode$ DamageDoneOnce | CombatDamage$ True | ValidSource$ Creature.Colorless+YouCtrl | TriggerZones$ Battlefield | ValidTarget$ Player | Execute$ TrigDraw | TriggerDescription$ Whenever one or more colorless creatures you control deal combat damage to a player, draw a card. SVar:TrigDraw:DB$ Draw SVar:PlayMain1:TRUE diff --git a/forge-gui/res/cardsfolder/upcoming/growing_dread.txt b/forge-gui/res/cardsfolder/upcoming/growing_dread.txt index 70491a847a0..316bab998d3 100644 --- a/forge-gui/res/cardsfolder/upcoming/growing_dread.txt +++ b/forge-gui/res/cardsfolder/upcoming/growing_dread.txt @@ -3,7 +3,7 @@ ManaCost:G U Types:Enchantment K:Flash T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDread | TriggerDescription$ When CARDNAME enters, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) -SVar:TrigDread:DB$ Manifest | Dread$ True | Defined$ You +SVar:TrigDread:DB$ ManifestDread T:Mode$ TurnFaceUp | ValidCard$ Permanent | ValidCause$ SpellAbility.YouCtrl | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you turn a permanent face up, put a +1/+1 counter on it. SVar:TrigPutCounter:DB$ PutCounter | Defined$ TriggeredCardLKICopy | CounterType$ P1P1 | CounterNum$ 1 Oracle:Flash\nWhen Growing Dread enters, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.)\nWhenever you turn a permanent face up, put a +1/+1 counter on it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/hauntwoods_shrieker.txt b/forge-gui/res/cardsfolder/upcoming/hauntwoods_shrieker.txt index 1cd5fb8ed13..f4d4fbcc1c1 100644 --- a/forge-gui/res/cardsfolder/upcoming/hauntwoods_shrieker.txt +++ b/forge-gui/res/cardsfolder/upcoming/hauntwoods_shrieker.txt @@ -3,6 +3,6 @@ ManaCost:1 G G Types:Creature Beast Mutant PT:3/3 T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDread | TriggerDescription$ Whenever CARDNAME attacks, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) -SVar:TrigDread:DB$ Manifest | Dread$ True +SVar:TrigDread:DB$ ManifestDread A:AB$ SetState | ValidTgts$ Card.faceDown | Cost$ 1 G | Mode$ TurnFaceUp | Optional$ True | RevealFirst$ True | ValidNewFace$ Creature | StackDescription$ SpellDescription | SpellDescription$ Reveal target face-down permanent. If it's a creature card, you may turn it face up. Oracle:Whenever Hauntwoods Shrieker attacks, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.)\n{1}{G}: Reveal target face-down permanent. If it's a creature card, you may turn it face up. diff --git a/forge-gui/res/cardsfolder/upcoming/innocuous_rat.txt b/forge-gui/res/cardsfolder/upcoming/innocuous_rat.txt index 79b7e1665e9..32c378de3fe 100644 --- a/forge-gui/res/cardsfolder/upcoming/innocuous_rat.txt +++ b/forge-gui/res/cardsfolder/upcoming/innocuous_rat.txt @@ -3,5 +3,5 @@ ManaCost:1 B Types:Creature Rat PT:1/1 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDread | TriggerDescription$ When CARDNAME dies, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) -SVar:TrigDread:DB$ Manifest | Dread$ True +SVar:TrigDread:DB$ ManifestDread Oracle:When Innocuous Rat dies, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/killers_mask.txt b/forge-gui/res/cardsfolder/upcoming/killers_mask.txt index fa707d3b1b9..29af1ed44cb 100644 --- a/forge-gui/res/cardsfolder/upcoming/killers_mask.txt +++ b/forge-gui/res/cardsfolder/upcoming/killers_mask.txt @@ -2,7 +2,7 @@ Name:Killer's Mask ManaCost:2 B Types:Artifact Equipment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDread | TriggerDescription$ When CARDNAME enters, manifest dread, then attach CARDNAME to that creature. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) -SVar:TrigDread:DB$ Manifest | Dread$ True | Defined$ You | RememberManifested$ True | SubAbility$ DBAttach +SVar:TrigDread:DB$ ManifestDread | RememberManifested$ True | SubAbility$ DBAttach SVar:DBAttach:DB$ Attach | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Menace | Description$ Equipped creature has menace. diff --git a/forge-gui/res/cardsfolder/upcoming/stay_hidden_stay_silent.txt b/forge-gui/res/cardsfolder/upcoming/stay_hidden_stay_silent.txt index 7ba8bc712a4..6119653662a 100644 --- a/forge-gui/res/cardsfolder/upcoming/stay_hidden_stay_silent.txt +++ b/forge-gui/res/cardsfolder/upcoming/stay_hidden_stay_silent.txt @@ -6,5 +6,5 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefi SVar:TrigTap:DB$ Tap | Defined$ Enchanted S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Enchanted creature doesn't untap during its controller's untap step. A:AB$ ChangeZone | Cost$ 4 U U | Origin$ Battlefield | Destination$ Library | Shuffle$ True | Defined$ Enchanted | SorcerySpeed$ True | SubAbility$ DBDread | SpellDescription$ Shuffle enchanted creature into its owner's library, then manifest dread. Activate only as a sorcery. -SVar:DBDread:DB$ Manifest | Dread$ True | Defined$ You +SVar:DBDread:DB$ ManifestDread Oracle:Enchant creature\nWhen Stay Hidden, Stay Silent enters, tap enchanted creature.\nEnchanted creature doesn't untap during its controller's untap step.\n{4}{U}{U}: Shuffle enchanted creature into its owner's library, then manifest dread. Activate only as a sorcery. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/they_came_from_the_pipes.txt b/forge-gui/res/cardsfolder/upcoming/they_came_from_the_pipes.txt index 0fc59a0c3bb..0ae12d6313b 100644 --- a/forge-gui/res/cardsfolder/upcoming/they_came_from_the_pipes.txt +++ b/forge-gui/res/cardsfolder/upcoming/they_came_from_the_pipes.txt @@ -2,7 +2,7 @@ Name:They Came from the Pipes ManaCost:4 U Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDread | TriggerDescription$ When CARDNAME enters, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) -SVar:TrigDread:DB$ Manifest | Dread$ True | Times$ 2 +SVar:TrigDread:DB$ ManifestDread | Amount$ 2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.faceDown+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a face-down creature you control enters, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 Oracle:When They Came from the Pipes enters, manifest dread twice. (To manifest dread, look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.)\nWhenever a face-down creature you control enters, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/threats_around_every_corner.txt b/forge-gui/res/cardsfolder/upcoming/threats_around_every_corner.txt index 0a0ee865f9c..dafa83df17e 100644 --- a/forge-gui/res/cardsfolder/upcoming/threats_around_every_corner.txt +++ b/forge-gui/res/cardsfolder/upcoming/threats_around_every_corner.txt @@ -2,7 +2,7 @@ Name:Threats Around Every Corner ManaCost:3 G Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDread | TriggerDescription$ When CARDNAME enters, manifest dread. -SVar:TrigDread:DB$ Manifest | Dread$ True | Defined$ You +SVar:TrigDread:DB$ ManifestDread T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Permanent.faceDown+YouCtrl | Execute$ TrigChange | TriggerZones$ Battlefield | TriggerDescription$ Whenever a face-down permanent you control enters, search your library for a basic land card, put it onto the battlefield tapped, then shuffle. SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 Oracle:When Threats Around Every Corner enters, manifest dread.\nWhenever a face-down permanent you control enters, search your library for a basic land card, put it onto the battlefield tapped, then shuffle. diff --git a/forge-gui/res/cardsfolder/upcoming/turn_inside_out.txt b/forge-gui/res/cardsfolder/upcoming/turn_inside_out.txt index 55470ca38d6..f008508581d 100644 --- a/forge-gui/res/cardsfolder/upcoming/turn_inside_out.txt +++ b/forge-gui/res/cardsfolder/upcoming/turn_inside_out.txt @@ -3,5 +3,5 @@ ManaCost:R Types:Instant A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | SubAbility$ DBDelayedTrigger | SpellDescription$ Target creature gets +3/+0 until end of turn. SVar:DBDelayedTrigger:DB$ DelayedTrigger | Mode$ ChangesZone | RememberObjects$ Targeted | ValidCard$ Card.IsTriggerRemembered | Origin$ Battlefield | Destination$ Graveyard | ThisTurn$ True | Execute$ DBDread | SpellDescription$ When it dies this turn, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) -SVar:DBDread:DB$ Manifest | Dread$ True | Defined$ You +SVar:DBDread:DB$ ManifestDread Oracle:Target creature gets +3/+0 until end of turn. When it dies this turn, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) diff --git a/forge-gui/res/cardsfolder/upcoming/twist_reality.txt b/forge-gui/res/cardsfolder/upcoming/twist_reality.txt index 30d0d766faa..c8d2a9539c3 100644 --- a/forge-gui/res/cardsfolder/upcoming/twist_reality.txt +++ b/forge-gui/res/cardsfolder/upcoming/twist_reality.txt @@ -3,5 +3,5 @@ ManaCost:1 U U Types:Instant A:SP$ Charm | Choices$ DBCounter,DBDread SVar:DBCounter:DB$ Counter | TargetType$ Spell | ValidTgts$ Card | TgtPrompt$ Counter target spell | SpellDescription$ Counter target spell. -SVar:DBDread:DB$ Manifest | Dread$ True | Defined$ You | SpellDescription$ Manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) +SVar:DBDread:DB$ ManifestDread | SpellDescription$ Manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) Oracle:Choose one —\n• Counter target spell.\n• Manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) diff --git a/forge-gui/res/cardsfolder/upcoming/under_the_skin.txt b/forge-gui/res/cardsfolder/upcoming/under_the_skin.txt index bb7c50a05b7..f8f5e402615 100644 --- a/forge-gui/res/cardsfolder/upcoming/under_the_skin.txt +++ b/forge-gui/res/cardsfolder/upcoming/under_the_skin.txt @@ -1,6 +1,6 @@ Name:Under the Skin ManaCost:2 G Types:Sorcery -A:SP$ Manifest | Dread$ True | SubAbility$ DBChangeZone | SpellDescription$ Manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) You may return a permanent card from your graveyard to your hand. +A:SP$ ManifestDread | SubAbility$ DBChangeZone | SpellDescription$ Manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) You may return a permanent card from your graveyard to your hand. SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ChangeType$ Permanent.YouOwn | Hidden$ True | Optional$ True Oracle:Manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.)\nYou may return a permanent card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/unsettling_twins.txt b/forge-gui/res/cardsfolder/upcoming/unsettling_twins.txt index 83c09545234..97e0167c946 100644 --- a/forge-gui/res/cardsfolder/upcoming/unsettling_twins.txt +++ b/forge-gui/res/cardsfolder/upcoming/unsettling_twins.txt @@ -3,5 +3,5 @@ ManaCost:3 W Types:Creature Human PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDread | TriggerDescription$ When CARDNAME enters, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) -SVar:TrigDread:DB$ Manifest | Dread$ True | Defined$ You +SVar:TrigDread:DB$ ManifestDread Oracle:When Unsettling Twins enters, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/unwanted_remake.txt b/forge-gui/res/cardsfolder/upcoming/unwanted_remake.txt index 7f56c5681bc..98d6b46360f 100644 --- a/forge-gui/res/cardsfolder/upcoming/unwanted_remake.txt +++ b/forge-gui/res/cardsfolder/upcoming/unwanted_remake.txt @@ -2,5 +2,5 @@ Name:Unwanted Remake ManaCost:W Types:Instant A:SP$ Destroy | ValidTgts$ Creature | SubAbility$ DBDread | SpellDescription$ Destroy target creature. -SVar:DBDread:DB$ Manifest | Dread$ True | DefinedPlayer$ TargetedController | SpellDescription$ Its controller manifests dread. (That player looks at the top two cards of their library, then puts one onto the battlefield face down as a 2/2 creature and the other into their graveyard. If it's a creature card, it can be turned face up any time for its mana cost.) +SVar:DBDread:DB$ ManifestDread | DefinedPlayer$ TargetedController | SpellDescription$ Its controller manifests dread. (That player looks at the top two cards of their library, then puts one onto the battlefield face down as a 2/2 creature and the other into their graveyard. If it's a creature card, it can be turned face up any time for its mana cost.) Oracle:Destroy target creature. Its controller manifests dread. (That player looks at the top two cards of their library, then puts one onto the battlefield face down as a 2/2 creature and the other into their graveyard. If it's a creature card, it can be turned face up any time for its mana cost.) diff --git a/forge-gui/res/cardsfolder/upcoming/valgavoths_onslaught.txt b/forge-gui/res/cardsfolder/upcoming/valgavoths_onslaught.txt index c7fa1502c0a..5a0bfa33281 100644 --- a/forge-gui/res/cardsfolder/upcoming/valgavoths_onslaught.txt +++ b/forge-gui/res/cardsfolder/upcoming/valgavoths_onslaught.txt @@ -1,7 +1,7 @@ Name:Valgavoth's Onslaught ManaCost:X X G Types:Instant -A:SP$ Manifest | Dread$ True | Times$ X | RememberManifested$ True | SubAbility$ DBPutCounterAll +A:SP$ ManifestDread | Amount$ X | RememberManifested$ True | SubAbility$ DBPutCounterAll SVar:DBPutCounterAll:DB$ PutCounterAll | ValidCards$ Card.IsRemembered | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid diff --git a/forge-gui/res/cardsfolder/upcoming/zimone_mystery_unraveler.txt b/forge-gui/res/cardsfolder/upcoming/zimone_mystery_unraveler.txt index aac64b09068..76b004c004e 100644 --- a/forge-gui/res/cardsfolder/upcoming/zimone_mystery_unraveler.txt +++ b/forge-gui/res/cardsfolder/upcoming/zimone_mystery_unraveler.txt @@ -3,7 +3,7 @@ ManaCost:2 G U Types:Legendary Creature Human Wizard PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDread | TriggerDescription$ Landfall — Whenever a land you control enters, manifest dread if this is the first time this ability has resolved this turn. Otherwise, you may turn a permanent you control face up. (To manifest dread, look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) -SVar:TrigDread:DB$ Manifest | Dread$ True | Defined$ You | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | SubAbility$ DBTurnFaceUp +SVar:TrigDread:DB$ ManifestDread | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | SubAbility$ DBTurnFaceUp SVar:DBTurnFaceUp:DB$ SetState | Optional$ True | Choices$ Permanent.faceDown+YouCtrl | ChoiceTitle$ Select a face-down permanent you control | ConditionCheckSVar$ X | ConditionSVarCompare$ GT1 | Mode$ TurnFaceUp SVar:X:Count$ResolvedThisTurn SVar:BuffedBy:Land From 79b1c3c9fd32bd2ccd937347b1d4476d7aa5b0ec Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Mon, 16 Sep 2024 19:38:30 +0800 Subject: [PATCH 07/37] Update PlayerControllerHuman.java show more info on choice list on non network game --- .../forge/player/PlayerControllerHuman.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 8619346af35..2b8d3698a06 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1859,12 +1859,14 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } final List res = Lists.newArrayListWithCapacity(possibleReplacers.size()); for (ReplacementEffect r : possibleReplacers) - res.add(r.toString()); + res.add(r.getDescription()); String prompt = localizer.getMessage("lblChooseFirstApplyReplacementEffect"); - final String firstStr = first.toString(); - for (int i = 1; i < possibleReplacers.size(); i++) { + final String firstStr = res.get(0); + for (int i = 1; i < res.size(); i++) { // prompt user if there are multiple different options - if (!possibleReplacers.get(i).toString().equals(firstStr)) { + if (!res.get(i).equals(firstStr)) { + if (!GuiBase.isNetworkplay()) //non network game show more info since they don't need serialization + return getGui().one(prompt, possibleReplacers); int index = res.indexOf(getGui().one(prompt, res)); if (index > -1) return possibleReplacers.get(index); @@ -1883,10 +1885,12 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final List sts = Lists.newArrayListWithCapacity(possibleStatics.size()); for (StaticAbility s : possibleStatics) sts.add(s.toString()); - final String firstStr = first.toString(); - for (int i = 1; i < possibleStatics.size(); i++) { + final String firstStr = sts.get(0); + for (int i = 1; i < sts.size(); i++) { // prompt user if there are multiple different options - if (!possibleStatics.get(i).toString().equals(firstStr)) { + if (!sts.get(i).equals(firstStr)) { + if (!GuiBase.isNetworkplay()) //non network game show more info since they don't need serialization + return getGui().one(prompt, possibleStatics); int index = sts.indexOf(getGui().one(prompt, sts)); if (index > -1) return possibleStatics.get(index); From 4c7c7edbf147fd7eb24efbd2e0327c76d125047a Mon Sep 17 00:00:00 2001 From: tool4ever Date: Mon, 16 Sep 2024 15:34:27 +0000 Subject: [PATCH 08/37] Update only_i_know_what_awaits.txt --- forge-gui/res/cardsfolder/upcoming/only_i_know_what_awaits.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/only_i_know_what_awaits.txt b/forge-gui/res/cardsfolder/upcoming/only_i_know_what_awaits.txt index 862e6fb5a7c..7cea15966b4 100644 --- a/forge-gui/res/cardsfolder/upcoming/only_i_know_what_awaits.txt +++ b/forge-gui/res/cardsfolder/upcoming/only_i_know_what_awaits.txt @@ -2,7 +2,7 @@ Name:Only I Know What Awaits ManaCost:no cost Types:Scheme T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ TrigRepeatEach | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, for each card type among permanents your opponents control, you may put a permanent card of that type from your hand onto the battlefield. -SVar:DBRepeatEach:DB$ RepeatEach | RepeatTypesFrom$ Permanent.OppCtrl | RepeatSubAbility$ ChooseCard | SubAbility$ DBChangeZoneAll +SVar:TrigRepeatEach:DB$ RepeatEach | RepeatTypesFrom$ Permanent.OppCtrl | RepeatSubAbility$ ChooseCard | SubAbility$ DBChangeZoneAll SVar:ChooseCard:DB$ ChooseCard | Choices$ Card.YouOwn+ChosenType | ChoiceTitle$ You may choose a card of this type to put onto the battlefield | ChoiceTitleAppend$ ChosenType | ChoiceZone$ Hand SVar:DBChangeZoneAll:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Hand | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True From 7c7c1fda0128bd9c95077582560344e1d01ae696 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Mon, 16 Sep 2024 22:13:43 +0200 Subject: [PATCH 09/37] Fulgur14 patch 191321 (#6158) --- forge-gui/res/cardsfolder/upcoming/barbflare_gremlin.txt | 2 +- forge-gui/res/cardsfolder/upcoming/convert_to_slime.txt | 2 +- forge-gui/res/cardsfolder/upcoming/dont_make_a_sound.txt | 2 +- forge-gui/res/cardsfolder/upcoming/ursine_monstrosity.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/barbflare_gremlin.txt b/forge-gui/res/cardsfolder/upcoming/barbflare_gremlin.txt index ec6c8e3c601..9fdcf9c3e29 100644 --- a/forge-gui/res/cardsfolder/upcoming/barbflare_gremlin.txt +++ b/forge-gui/res/cardsfolder/upcoming/barbflare_gremlin.txt @@ -6,5 +6,5 @@ K:First Strike K:Haste T:Mode$ TapsForMana | ValidCard$ Land | PresentDefined$ Self | IsPresent$ Card.tapped | Execute$ TrigMana | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever a player taps a land for mana, if CARDNAME is tapped, that player adds one mana of any type that land produced. Then that land deals 1 damage to that player. SVar:TrigMana:DB$ ManaReflected | ColorOrType$ Type | ReflectProperty$ Produced | Defined$ TriggeredActivator | SubAbility$ DBDealDamage -SVar:DBDamage:DB$ DealDamage | Defined$ TriggeredActivator | DamageSource$ TriggeredCard | NumDmg$ 1 +SVar:DBDealDamage:DB$ DealDamage | Defined$ TriggeredActivator | DamageSource$ TriggeredCard | NumDmg$ 1 Oracle:First strike, haste\nWhenever a player taps a land for mana, if Barbflare Gremlin is tapped, that player adds one mana of any type that land produced. Then that land deals 1 damage to that player. diff --git a/forge-gui/res/cardsfolder/upcoming/convert_to_slime.txt b/forge-gui/res/cardsfolder/upcoming/convert_to_slime.txt index df52d6c6842..535711c7829 100644 --- a/forge-gui/res/cardsfolder/upcoming/convert_to_slime.txt +++ b/forge-gui/res/cardsfolder/upcoming/convert_to_slime.txt @@ -5,7 +5,7 @@ A:SP$ Pump | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Artifact | TgtPrompt$ Sele SVar:DBPump1:DB$ Pump | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature to destroy | AILogic$ Destroy | IsCurse$ True | SubAbility$ DBPump2 SVar:DBPump2:DB$ Pump | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment to destroy | AILogic$ Destroy | IsCurse$ True | SubAbility$ DBDestroy SVar:DBDestroy:DB$ Destroy | Defined$ Targeted | RememberDestroyed$ True | SubAbility$ DBToken -SVar:DBToken:DB$ Token | Condition$ Delirium | TokenAmount$ 1 | TokenScript$ g_x_x_ooze | TokenOwner$ You | TokenPower$ X | TokenToughness$ X | SubAbility$ DBCleanUp +SVar:DBToken:DB$ Token | Condition$ Delirium | TokenAmount$ 1 | TokenScript$ g_x_x_ooze | TokenOwner$ You | TokenPower$ X | TokenToughness$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$SumCMC Oracle:Destroy up to one target artifact, up to one target creature, and up to one target enchantment.\nDelirium — Then if there are four or more card types among cards in your graveyard, create an X/X green Ooze token, where X is the total mana value of permanents destroyed this way. diff --git a/forge-gui/res/cardsfolder/upcoming/dont_make_a_sound.txt b/forge-gui/res/cardsfolder/upcoming/dont_make_a_sound.txt index 97138bd0bda..fd5e54017c9 100644 --- a/forge-gui/res/cardsfolder/upcoming/dont_make_a_sound.txt +++ b/forge-gui/res/cardsfolder/upcoming/dont_make_a_sound.txt @@ -1,6 +1,6 @@ Name:Don't Make a Sound ManaCost:1 U Types:Instant -A:SP$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 2 | UnlessResolveSubs$ WhenPaid | SubAbility$ DBSurveil | SpellDescription$ Counter target spell unless its controller pays {2}. If they do, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) +A:SP$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 2 | UnlessResolveSubs$ WhenPaid | SubAbility$ TrigSurveil | SpellDescription$ Counter target spell unless its controller pays {2}. If they do, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) SVar:TrigSurveil:DB$ Surveil | Amount$ 2 Oracle:Counter target spell unless its controller pays {2}. If they do, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) diff --git a/forge-gui/res/cardsfolder/upcoming/ursine_monstrosity.txt b/forge-gui/res/cardsfolder/upcoming/ursine_monstrosity.txt index 235e19e93cf..2a38040328c 100644 --- a/forge-gui/res/cardsfolder/upcoming/ursine_monstrosity.txt +++ b/forge-gui/res/cardsfolder/upcoming/ursine_monstrosity.txt @@ -5,7 +5,7 @@ PT:3/3 K:Trample T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigMill | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, mill a card and choose an opponent at random. CARDNAME attacks that player this combat if able. Until end of turn, CARDNAME gains indestructible and gets +1/+1 for each card type among cards in your graveyard. SVar:TrigMill:DB$ Mill | Defined$ You | NumCards$ 1 | SubAbility$ DBChoose -SVar:DBChoose:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | Random$ True | SubAbility$ DBPEffect +SVar:DBChoose:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | Random$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ Self | ExileOnMoved$ Battlefield | StaticAbilities$ AttackChosen | Duration$ UntilEndOfCombat | SubAbility$ DBPump SVar:AttackChosen:Mode$ MustAttack | ValidCreature$ Card.IsRemembered | MustAttack$ ChosenPlayer | Description$ EFFECTSOURCE attacks that player this combat if able. SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ X | NumDef$ X | KW$ Indestructible From 0a4cff5adc42d551bdc832ffec3af7be202057f7 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Tue, 17 Sep 2024 07:38:06 +0200 Subject: [PATCH 10/37] Update suspended_sentence.txt --- forge-gui/res/cardsfolder/upcoming/suspended_sentence.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/upcoming/suspended_sentence.txt b/forge-gui/res/cardsfolder/upcoming/suspended_sentence.txt index 9f8d0e0ed1d..71b652b45d8 100644 --- a/forge-gui/res/cardsfolder/upcoming/suspended_sentence.txt +++ b/forge-gui/res/cardsfolder/upcoming/suspended_sentence.txt @@ -1,6 +1,7 @@ Name:Suspended Sentence ManaCost:3 B Types:Instant +K:Suspend:3:1 B A:SP$ Destroy | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | SubAbility$ DBLoseLife | SpellDescription$ Destroy target creature an opponent controls. That player loses 3 life. Exile CARDNAME with three time counters on it. SVar:DBLoseLife:DB$ LoseLife | Defined$ TargetedController | LifeAmount$ 3 | SubAbility$ DBChange SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | WithCountersType$ TIME | WithCountersAmount$ 3 From 663bde22ac9efdf691d6efd63dba914c1abe44d5 Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Tue, 17 Sep 2024 14:58:43 +0800 Subject: [PATCH 11/37] Add ReplacementEffectView, StaticAbility View for Netplay Dialog --- .../game/replacement/ReplacementEffect.java | 10 ++++ .../replacement/ReplacementEffectView.java | 47 +++++++++++++++++++ .../game/staticability/StaticAbility.java | 11 +++++ .../game/staticability/StaticAbilityView.java | 47 +++++++++++++++++++ .../forge/trackable/TrackableProperty.java | 8 ++++ .../forge/player/PlayerControllerHuman.java | 26 +++++----- 6 files changed, 134 insertions(+), 15 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/replacement/ReplacementEffectView.java create mode 100644 forge-game/src/main/java/forge/game/staticability/StaticAbilityView.java diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java b/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java index 1836337d45a..90747deaa5e 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java @@ -60,6 +60,7 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { private boolean hasRun = false; private List otherChoices = null; + private ReplacementEffectView view = null; /** * Gets the id. @@ -109,6 +110,15 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { } } + public ReplacementEffectView getView() { + if (view == null) + view = new ReplacementEffectView(this); + else { + view.updateHostCard(this); + view.updateDescription(this); + } + return view; + } /** * Sets the checks for run. * diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementEffectView.java b/forge-game/src/main/java/forge/game/replacement/ReplacementEffectView.java new file mode 100644 index 00000000000..156431de6d8 --- /dev/null +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementEffectView.java @@ -0,0 +1,47 @@ +package forge.game.replacement; + +import forge.game.card.CardView; +import forge.game.card.IHasCardView; +import forge.trackable.TrackableObject; +import forge.trackable.TrackableProperty; +import forge.trackable.Tracker; + +public class ReplacementEffectView extends TrackableObject implements IHasCardView { + private static final long serialVersionUID = 1L; + + ReplacementEffectView(ReplacementEffect re) { + this(re, re.getHostCard() == null || re.getHostCard().getGame() == null ? null : re.getHostCard().getGame().getTracker()); + } + + ReplacementEffectView(ReplacementEffect re, Tracker tracker) { + super(re.getId(), tracker); + updateHostCard(re); + updateDescription(re); + } + + @Override + public CardView getCardView() { + return this.getHostCard(); + } + + public CardView getHostCard() { + return get(TrackableProperty.RE_HostCard); + } + + void updateHostCard(ReplacementEffect re) { + set(TrackableProperty.RE_HostCard, CardView.get(re.getHostCard())); + } + + @Override + public String toString() { + return this.getDescription(); + } + + public String getDescription() { + return get(TrackableProperty.RE_Description); + } + + void updateDescription(ReplacementEffect re) { + set(TrackableProperty.RE_Description, re.getDescription()); + } +} 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 327296f0d9c..8f292c2f328 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -62,6 +62,7 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone private int mayPlayTurn = 0; private SpellAbility payingTrigSA; + private StaticAbilityView view = null; @Override public final int getId() { @@ -231,6 +232,16 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone this.setCardState(state); } + public StaticAbilityView getView() { + if (view == null) + view = new StaticAbilityView(this); + else { + view.updateHostCard(this); + view.updateDescription(this); + } + return view; + } + public final CardCollectionView applyContinuousAbilityBefore(final StaticAbilityLayer layer, final CardCollectionView preList) { if (!shouldApplyContinuousAbility(layer, false)) { return null; diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityView.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityView.java new file mode 100644 index 00000000000..21fe417994e --- /dev/null +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityView.java @@ -0,0 +1,47 @@ +package forge.game.staticability; + +import forge.game.card.CardView; +import forge.game.card.IHasCardView; +import forge.trackable.TrackableObject; +import forge.trackable.TrackableProperty; +import forge.trackable.Tracker; + +public class StaticAbilityView extends TrackableObject implements IHasCardView { + private static final long serialVersionUID = 1L; + + StaticAbilityView(StaticAbility st) { + this(st, st.getHostCard() == null || st.getHostCard().getGame() == null ? null : st.getHostCard().getGame().getTracker()); + } + + StaticAbilityView(StaticAbility st, Tracker tracker) { + super(st.getId(), tracker); + updateHostCard(st); + updateDescription(st); + } + + @Override + public CardView getCardView() { + return this.getHostCard(); + } + + public CardView getHostCard() { + return get(TrackableProperty.ST_HostCard); + } + + void updateHostCard(StaticAbility st) { + set(TrackableProperty.ST_HostCard, CardView.get(st.getHostCard())); + } + + @Override + public String toString() { + return this.getDescription(); + } + + public String getDescription() { + return get(TrackableProperty.ST_Description); + } + + void updateDescription(StaticAbility st) { + set(TrackableProperty.ST_Description, st.toString()); + } +} diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 88a10d07e93..8176cff31b5 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -241,6 +241,14 @@ public enum TrackableProperty { CanPlay(TrackableTypes.BooleanType), PromptIfOnlyPossibleAbility(TrackableTypes.BooleanType), + //ReplacementEffectView + RE_HostCard(TrackableTypes.CardViewType), + RE_Description(TrackableTypes.StringType), + + //StaticAbilityView + ST_HostCard(TrackableTypes.CardViewType), + ST_Description(TrackableTypes.StringType), + //HasBackSide BackSideName(TrackableTypes.StringType), HasBackSide(TrackableTypes.BooleanType), diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 2b8d3698a06..aa90be9c9c6 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -35,9 +35,11 @@ import forge.game.player.*; import forge.game.player.actions.SelectCardAction; import forge.game.player.actions.SelectPlayerAction; import forge.game.replacement.ReplacementEffect; +import forge.game.replacement.ReplacementEffectView; import forge.game.replacement.ReplacementLayer; import forge.game.spellability.*; import forge.game.staticability.StaticAbility; +import forge.game.staticability.StaticAbilityView; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; import forge.game.trigger.WrappedAbility; @@ -1857,19 +1859,16 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont if (possibleReplacers.size() == 1) { return first; } - final List res = Lists.newArrayListWithCapacity(possibleReplacers.size()); - for (ReplacementEffect r : possibleReplacers) - res.add(r.getDescription()); - String prompt = localizer.getMessage("lblChooseFirstApplyReplacementEffect"); + final List res = possibleReplacers.stream().map(ReplacementEffect::getDescription).collect(Collectors.toList()); final String firstStr = res.get(0); + final String prompt = localizer.getMessage("lblChooseFirstApplyReplacementEffect"); for (int i = 1; i < res.size(); i++) { // prompt user if there are multiple different options if (!res.get(i).equals(firstStr)) { - if (!GuiBase.isNetworkplay()) //non network game show more info since they don't need serialization + if (!GuiBase.isNetworkplay()) //non network game don't need serialization return getGui().one(prompt, possibleReplacers); - int index = res.indexOf(getGui().one(prompt, res)); - if (index > -1) - return possibleReplacers.get(index); + ReplacementEffectView rev = getGui().one(prompt, possibleReplacers.stream().map(ReplacementEffect::getView).collect(Collectors.toList())); + return possibleReplacers.stream().filter(re -> re.getId() == rev.getId()).findAny().orElse(first); } } // return first option without prompting if all options are the same @@ -1882,18 +1881,15 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont if (possibleStatics.size() == 1 || !fullControl) { return first; } - final List sts = Lists.newArrayListWithCapacity(possibleStatics.size()); - for (StaticAbility s : possibleStatics) - sts.add(s.toString()); + final List sts = possibleStatics.stream().map(StaticAbility::toString).collect(Collectors.toList()); final String firstStr = sts.get(0); for (int i = 1; i < sts.size(); i++) { // prompt user if there are multiple different options if (!sts.get(i).equals(firstStr)) { - if (!GuiBase.isNetworkplay()) //non network game show more info since they don't need serialization + if (!GuiBase.isNetworkplay()) //non network game don't need serialization return getGui().one(prompt, possibleStatics); - int index = sts.indexOf(getGui().one(prompt, sts)); - if (index > -1) - return possibleStatics.get(index); + StaticAbilityView stv = getGui().one(prompt, possibleStatics.stream().map(StaticAbility::getView).collect(Collectors.toList())); + return possibleStatics.stream().filter(st -> st.getId() == stv.getId()).findAny().orElse(first); } } // return first option without prompting if all options are the same From 5d389ad62c903be4d45c20d3a9f84e6b4dac9d03 Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Tue, 17 Sep 2024 08:32:45 +0100 Subject: [PATCH 12/37] Edition updates: SCH, SLD --- forge-gui/res/editions/Secret Lair Drop Series.txt | 6 ++++++ forge-gui/res/editions/Store Championships.txt | 3 +++ 2 files changed, 9 insertions(+) diff --git a/forge-gui/res/editions/Secret Lair Drop Series.txt b/forge-gui/res/editions/Secret Lair Drop Series.txt index 695320306e7..e15e992ac93 100644 --- a/forge-gui/res/editions/Secret Lair Drop Series.txt +++ b/forge-gui/res/editions/Secret Lair Drop Series.txt @@ -801,6 +801,7 @@ F798 M Discord, Lord of Disharmony @Narendra Bintara Adi 876 R Xorn @Ivan Shavrin 877 R Druid of Purification @Alexander Mokhov 878 R Prosperous Innkeeper @Tyler Jacobson +879 M Minsc & Boo, Timeless Heroes @Justin Gerard 900 M The Scarab God @Barely Human 901 R Lightning Bolt @Christopher Rush 903 M The Locust God @See Machine @@ -1593,6 +1594,11 @@ F1540 M Rainbow Dash @John Thacker 1715 R Mayhem Devil @Kathleen Neeley & AndWorld Design 1716 R Moldervine Reclamation @Kathleen Neeley & AndWorld Design 1717 M Prossh, Skyraider of Kher @Kathleen Neeley & AndWorld Design +1768 R Careful Study @Tyler Walpole +1769 M Living End @Tyler Walpole +1770 R Eladamri's Call @Tyler Walpole +1771 R Boros Charm @Tyler Walpole +1772 R Unlicensed Hearse @Tyler Walpole 1778 R Fell the Mighty @Greg Bell 1779 R Faithless Looting @Dave Trampier 1780 M Goldspan Dragon @Larry Elmore diff --git a/forge-gui/res/editions/Store Championships.txt b/forge-gui/res/editions/Store Championships.txt index 40deaeffc15..bd1c9099127 100644 --- a/forge-gui/res/editions/Store Championships.txt +++ b/forge-gui/res/editions/Store Championships.txt @@ -35,3 +35,6 @@ ScryfallCode=SCH 27 R Monastery Swiftspear @Francisco Miyara 28 R Shark Typhoon @Carlos Palma Cruchaga 29 R Urza's Saga @Eytan Zana +30 R Chromatic Sphere @Lorenzo Lanfranconi +31 R Reality Smasher @Michal Ivan +32 R Void Winnower @Joshua Raphael From 120d435424458334ceba4f1b7ad58266e600915f Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Tue, 17 Sep 2024 08:51:21 +0100 Subject: [PATCH 13/37] Format updates for DSK & DSC --- forge-gui/res/formats/Archived/Alchemy/2024-09-24.txt | 6 ++++++ .../res/formats/Archived/Arena Standard/2024-09-24.txt | 6 ++++++ forge-gui/res/formats/Archived/Explorer/2024-09-24.txt | 8 ++++++++ forge-gui/res/formats/Archived/Historic/2024-09-24.txt | 8 ++++++++ forge-gui/res/formats/Archived/Legacy/2024-09-27.txt | 8 ++++++++ forge-gui/res/formats/Archived/Modern/2024-09-27.txt | 7 +++++++ forge-gui/res/formats/Archived/Pioneer/2024-09-27.txt | 7 +++++++ forge-gui/res/formats/Archived/Standard/2024-09-27.txt | 6 ++++++ forge-gui/res/formats/Archived/Timeless/2024-09-24.txt | 8 ++++++++ forge-gui/res/formats/Archived/Vintage/2024-09-27.txt | 9 +++++++++ forge-gui/res/formats/Casual/Brawl.txt | 2 +- forge-gui/res/formats/Sanctioned/Historic.txt | 2 +- forge-gui/res/formats/Sanctioned/Legacy.txt | 2 +- forge-gui/res/formats/Sanctioned/Modern.txt | 2 +- forge-gui/res/formats/Sanctioned/Pioneer.txt | 2 +- forge-gui/res/formats/Sanctioned/Standard.txt | 2 +- forge-gui/res/formats/Sanctioned/Vintage.txt | 2 +- 17 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 forge-gui/res/formats/Archived/Alchemy/2024-09-24.txt create mode 100644 forge-gui/res/formats/Archived/Arena Standard/2024-09-24.txt create mode 100644 forge-gui/res/formats/Archived/Explorer/2024-09-24.txt create mode 100644 forge-gui/res/formats/Archived/Historic/2024-09-24.txt create mode 100644 forge-gui/res/formats/Archived/Legacy/2024-09-27.txt create mode 100644 forge-gui/res/formats/Archived/Modern/2024-09-27.txt create mode 100644 forge-gui/res/formats/Archived/Pioneer/2024-09-27.txt create mode 100644 forge-gui/res/formats/Archived/Standard/2024-09-27.txt create mode 100644 forge-gui/res/formats/Archived/Timeless/2024-09-24.txt create mode 100644 forge-gui/res/formats/Archived/Vintage/2024-09-27.txt diff --git a/forge-gui/res/formats/Archived/Alchemy/2024-09-24.txt b/forge-gui/res/formats/Archived/Alchemy/2024-09-24.txt new file mode 100644 index 00000000000..105806693b8 --- /dev/null +++ b/forge-gui/res/formats/Archived/Alchemy/2024-09-24.txt @@ -0,0 +1,6 @@ +[format] +Name:Alchemy (DSK) +Type:Archived +Subtype:Arena +Effective:2024-09-24 +Sets:ANA, ANB, WOE, YWOE, LCI, YLCI, MKM, YMKM, OTJ, BIG, YOTJ, BLB, YBLB, DSK diff --git a/forge-gui/res/formats/Archived/Arena Standard/2024-09-24.txt b/forge-gui/res/formats/Archived/Arena Standard/2024-09-24.txt new file mode 100644 index 00000000000..1b84ba9eb95 --- /dev/null +++ b/forge-gui/res/formats/Archived/Arena Standard/2024-09-24.txt @@ -0,0 +1,6 @@ +[format] +Name:Arena Standard (DSK) +Type:Archived +Subtype:Standard +Effective:2024-09-24 +Sets:DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB, DSK diff --git a/forge-gui/res/formats/Archived/Explorer/2024-09-24.txt b/forge-gui/res/formats/Archived/Explorer/2024-09-24.txt new file mode 100644 index 00000000000..dfebbeeef91 --- /dev/null +++ b/forge-gui/res/formats/Archived/Explorer/2024-09-24.txt @@ -0,0 +1,8 @@ +[format] +Name:Explorer (DSK) +Type:Archived +Subtype:Pioneer +Effective:2024-09-24 +Sets:KTK, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC, EA1, DMU, BRO, EA2, ONE, MOM, MAT, EA3, WOE, LCI, MKM, OTJ, BIG, BLB, DSK +Banned:Amalia Benavides Aguirre; Bloodstained Mire; Expressive Iteration; Field of the Dead; Flooded Strand; Geological Appraiser; Karn, the Great Creator; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Sorin, Imperious Bloodlord; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Windswept Heath; Winota, Joiner of Forces; Wooded Foothills +Additional:Abandoned Sarcophagus; Abundant Maw; Accursed Horde; Accursed Witch; Adaptive Snapjaw; Adorned Pouncer; Advanced Stitchwing; Aerial Guide; Aerial Responder; Aeronaut Admiral; Aether Chaser; Aether Hub; Aether Inspector; Aether Meltdown; Aether Poisoner; Aether Swooper; Aether Theorist; Aether Tradewinds; Aetherborn Marauder; Aetherflux Reservoir; Aethersphere Harvester; Aetherstorm Roc; Aetherstream Leopard; Aethertorch Renegade; Aetherworks Marvel; Ahn-Crop Champion; Ahn-Crop Crasher; Aim High; Airdrop Aeronauts; Ajani Unyielding; Alchemist's Greeting; Alley Evasion; Alley Strangler; Alms of the Vein; Altar's Reap; Altered Ego; Always Watching; Ammit Eternal; Anafenza, Kin-Tree Spirit; Ancestral Statue; Ancient Crab; Angel of Invention; Angel of Sanctions; Angel of the God-Pharaoh; Angelic Edict; Angelic Purge; Anger of the Gods; Anguished Unmaking; Animation Module; Anointed Procession; Anointer Priest; Apothecary Geist; Appeal // Authority; Appetite for the Unnatural; Approach of the Second Sun; Arborback Stomper; Archangel Avacyn; Archfiend of Ifnir; Arlinn Kord; Armorcraft Judge; As Foretold; Assassin's Strike; Assault Formation; Assembled Alphas; Astral Cornucopia; Asylum Visitor; Atarka's Command; Attune with Aether; Audacious Infiltrator; Auger Spree; Aurelia, the Warleader; Authority of the Consuls; Avacyn's Judgment; Aven Initiate; Aven Mindcensor; Aven of Enduring Hope; Aven Wind Guide; Aviary Mechanic; Baleful Ammit; Ballista Charger; Baral's Expertise; Baral, Chief of Compliance; Barrage of Expendables; Barricade Breaker; Bastion Mastodon; Bathe in Dragonfire; Battering Krasis; Battlefield Scavenger; Bedlam Reveler; Belligerent Sliver; Beneath the Sands; Binding Mummy; Biting Rain; Bitterbow Sharpshooters; Black Cat; Blessed Alliance; Blessed Spirits; Blighted Bat; Blind Obedience; Blood Host; Blood Mist; Bloodbond Vampire; Bloodbriar; Bloodhall Priest; Bloodhunter Bat; Bloodlust Inciter; Bloodmad Vampire; Bloodrage Brawler; Blossoming Defense; Blur of Blades; Blur Sliver; Bogbrew Witch; Bomat Bazaar Barge; Bomat Courier; Bonded Construct; Bone Picker; Bone Saw; Bonescythe Sliver; Bontu the Glorified; Bontu's Last Reckoning; Bontu's Monument; Borderland Marauder; Borderland Minotaur; Boros Elite; Borrowed Grace; Borrowed Hostility; Borrowed Malevolence; Bound by Moonsilver; Brain in a Jar; Brain Maggot; Breaching Hippocamp; Bred for the Hunt; Briarbridge Patrol; Brisela, Voice of Nightmares; Bristling Hydra; Bruna, the Fading Light; Brushstrider; Brute Strength; Bubbling Cauldron; Built to Last; Built to Smash; Burn from Within; Burning-Fist Minotaur; Burning-Tree Emissary; Burnished Hart; By Force; Bygone Bishop; Byway Courier; Call the Bloodline; Canyon Slough; Carrier Thrall; Cartouche of Ambition; Cartouche of Knowledge; Cartouche of Solidarity; Cartouche of Strength; Cartouche of Zeal; Cascading Cataracts; Cast Out; Cataclysmic Gearhulk; Cathar's Companion; Cemetery Recruitment; Censor; Ceremonious Rejection; Certain Death; Champion of Rhonas; Champion of Wits; Chandra's Defeat; Chandra's Revolution; Chandra, Pyromaster; Chandra, Torch of Defiance; Chaos Maw; Charging Badger; Chief of the Foundry; Chittering Host; Choked Estuary; Cinder Elemental; Claim // Fame; Cloudblazer; Cogworker's Puzzleknot; Collateral Damage; Collected Company; Collective Brutality; Collective Defiance; Collective Effort; Combat Celebrant; Combustible Gearhulk; Commencement of Festivities; Commit // Memory; Compelling Argument; Compelling Deterrence; Compulsory Rest; Conduit of Storms; Confirm Suspicions; Confiscation Coup; Confront the Unknown; Consign // Oblivion; Consulate Skygate; Consulate Turret; Contraband Kingpin; Conviction; Coralhelm Guide; Corpse Hauler; Countervailing Winds; Countless Gears Renegade; Courageous Outrider; Crawling Sensation; Creeping Mold; Crested Sunmare; Crocanura; Crocodile of the Crossing; Crow of Dark Tidings; Cruel Reality; Crux of Fate; Crypt of the Eternals; Cryptbreaker; Cryptic Serpent; Cryptolith Fragment; Cryptolith Rite; Cultivator's Caravan; Curator of Mysteries; Curious Homunculus; Cut // Ribbons; Dance with Devils; Daredevil Dragster; Daring Demolition; Daring Sleuth; Dark Intimations; Dark Salvation; Dauntless Aven; Dauntless Cathar; Dauntless Onslaught; Dawn Gryff; Dawnfeather Eagle; Death Wind; Death's Approach; Deathcap Cultivator; Decimator of the Provinces; Declaration in Stone; Decoction Module; Deem Worthy; Defiant Greatmaw; Defiant Salvager; Demolition Stomper; Demon of Dark Schemes; Demonic Pact; Deny Existence; Depala, Pilot Exemplar; Deranged Whelp; Descend upon the Sinful; Desert Cerodon; Desert of the Fervent; Desert of the Glorified; Desert of the Indomitable; Desert of the Mindful; Desert of the True; Desert's Hold; Destined // Lead; Devils' Playground; Devilthorn Fox; Devouring Light; Die Young; Diffusion Sliver; Dinrova Horror; Diregraf Colossus; Disallow; Disposal Mummy; Dispossess; Dissenter's Deliverance; Distended Mindbender; Djeru's Renunciation; Djeru's Resolve; Docent of Perfection; Doom Blade; Doomfall; Douse in Gloom; Dovin Baan; Drag Under; Dragon Fodder; Dragon Hatchling; Dragon Mantle; Dragonloft Idol; Dragonlord's Servant; Dragonmaster Outcast; Drainpipe Vermin; Drake Haven; Drana, Liberator of Malakir; Dread Wanderer; Driven // Despair; Drogskol Shieldmate; Dromoka's Command; Drownyard Behemoth; Drownyard Explorers; Drunau Corpse Trawler; Dukhara Peafowl; Dune Beetle; Dusk // Dawn; Dusk Feaster; Duskwatch Recruiter; Dutiful Attendant; Dwynen's Elite; Dynavolt Tower; Eager Construct; Earthshaker Khenra; Eddytrail Hawk; Edifice of Authority; Elder Deep-Fiend; Eldritch Evolution; Electrostatic Pummeler; Elemental Uprising; Elusive Krasis; Elvish Visionary; Ember-Eye Wolf; Embraal Bruiser; Empyreal Voyager; Emrakul, the Promised End; Engineered Might; Enlarge; Enraged Giant; Epiphany at the Drownyard; Era of Innovation; Erdwal Illuminator; Essence Extraction; Essence Flux; Eternal of Harsh Truths; Eternal Scourge; Eternal Thirst; Ever After; Evolutionary Leap; Exemplar of Strength; Exultant Cultist; Eyeblight Assassin; Fabrication Module; Failure // Comply; Fairgrounds Warden; Faith of the Devoted; Faith Unbroken; Faithbearer Paladin; Falkenrath Gorger; Fan Bearer; Fanatic of Mogis; Farm // Market; Fatal Push; Fateful Showdown; Fen Hauler; Feral Prowler; Fervent Paincaster; Festering Mummy; Festering Newt; Fetid Pools; Fevered Visions; Fiend Binder; Fiery Temper; Filigree Familiar; Final Reward; Firebrand Archer; Fireforger's Puzzleknot; Flame Lash; Flameblade Adept; Flameblade Angel; Flames of the Firebrand; Fleeting Memories; Fleshbag Marauder; Floodwaters; Flurry of Horns; Fog; Fogwalker; Foreboding Ruins; Forge Devil; Forgotten Creation; Forsake the Worldly; Fortified Village; Fortify; Fortuitous Find; Foundry Hornet; Foundry Inspector; Foundry Screecher; Foundry Street Denizen; Fourth Bridge Prowler; Fragmentize; Fraying Sanity; Freejam Regent; Fretwork Colony; Frontline Rebel; Fumigate; Furious Reprisal; Furnace Whelp; Furyblade Vampire; Galvanic Bombardment; Game Trail; Gate to the Afterlife; Gatstaf Arsonists; Gavony Unhallowed; Gearseeker Serpent; Gearshift Ace; Geier Reach Bandit; Geier Reach Sanitarium; Geist of the Archives; Geralf's Masterpiece; Ghoulcaller's Accomplice; Gideon of the Trials; Gideon's Intervention; Gifted Aetherborn; Gilded Cerodon; Gisa and Geralf; Gisa's Bidding; Gisela, the Broken Blade; Glimmer of Genius; Glint; Glint-Nest Crane; Glint-Sleeve Artisan; Glint-Sleeve Siphoner; Glorious End; Glory-Bound Initiate; Glorybringer; Gnarlwood Dryad; Goblin Dark-Dwellers; Goblin Rally; Goblin Shortcutter; God-Pharaoh's Gift; Goldnight Castigator; Gonti, Lord of Luxury; Graf Harvest; Graf Mole; Graf Rats; Grapple with the Past; Greenbelt Rampager; Grim Flayer; Grind // Dust; Grisly Salvage; Grotesque Mutation; Groundskeeper; Gryff's Boon; Guardian of Pilgrims; Gust Walker; Hamlet Captain; Hanweir Battlements; Hanweir Garrison; Hanweir Militia Captain; Hanweir, the Writhing Township; Hapatra, Vizier of Poisons; Harmless Offering; Harnessed Lightning; Harsh Mentor; Harvest Hand; Hashep Oasis; Haunted Dead; Hazardous Conditions; Haze of Pollen; Hazoret the Fervent; Hazoret's Monument; Heart of Kiran; Heaven // Earth; Hedron Archive; Heir of Falkenrath; Hekma Sentinels; Herald of Anguish; Herald of the Fair; Heron's Grace Champion; Hidden Stockpile; Hieroglyphic Illumination; Highspire Artisan; Highspire Infusion; Hinterland Drake; Hinterland Logger; Hive Stirrings; Hollow One; Homing Lightning; Honored Crop-Captain; Hooded Brawler; Hope Against Hope; Hope of Ghirapur; Hope Tender; Hornet Queen; Horror of the Broken Lands; Hour of Devastation; Hour of Promise; Hour of Revelation; Howlpack Resurgence; Howlpack Wolf; Humble the Brute; Hungry Flames; Ice Over; Ifnir Deadlands; Illusionist's Stratagem; Imminent Doom; Impact Tremors; Impeccable Timing; Implement of Combustion; Implement of Examination; Implement of Malice; Imprisoned in the Moon; In Oketra's Name; Incendiary Flow; Incorrigible Youths; Indomitable Creativity; Indulgent Aristocrat; Ingenious Skaab; Initiate's Companion; Insatiable Gorgers; Insolent Neonate; Inspiring Call; Inspiring Statuary; Insult // Injury; Intrepid Provisioner; Invasive Surgery; Inventor's Apprentice; Inventor's Goggles; Inventors' Fair; Invigorated Rampage; Ipnu Rivulet; Ironclad Slayer; Irontread Crusher; Irrigated Farmland; Ishkanah, Grafwidow; Jace's Scrutiny; Jace, Unraveler of Secrets; Just the Wind; Kalastria Nightwatch; Kambal, Consul of Allocation; Kari Zev's Expertise; Kari Zev, Skyship Raider; Kefnet the Mindful; Kefnet's Monument; Key to the City; Khenra Charioteer; Khenra Eternal; Khenra Scrapper; Kindly Stranger; Kolaghan's Command; Kujar Seedsculptor; Laboratory Brute; Labyrinth Guardian; Languish; Lathnu Sailback; Launch Party; Lawless Broker; Lay Claim; Leaf Gilder; Leave // Chance; Leave in the Dust; Leeching Sliver; Lethal Sting; Lifecraft Cavalry; Lifecrafter's Bestiary; Lifecrafter's Gift; Lightning Axe; Lightning Diadem; Lightning Shrieker; Lightwalker; Liliana's Defeat; Liliana's Elite; Liliana's Mastery; Liliana's Reaver; Liliana, Death's Majesty; Liliana, the Last Hope; Live Fast; Lone Rider; Long Road Home; Longtusk Cub; Lord of the Accursed; Lost Legacy; Lunarch Mantle; Lupine Prototype; Mad Prophet; Magma Jet; Magma Spray; Magmaroth; Magmatic Chasm; Majestic Myriarch; Make Mischief; Make Obsolete; Malakir Cullblade; Malakir Familiar; Malfunction; Manaweft Sliver; Manglehorn; Manic Scribe; Marauding Boneslasher; Marionette Master; Markov Crusader; Master Trinketeer; Maulfist Revolutionary; Maulfist Squad; Maverick Thopterist; Maze's End; Merchant's Dockhand; Merciless Javelineer; Merciless Resolve; Mercurial Geists; Metallic Mimic; Metallic Rebuke; Metallurgic Summonings; Metalspinner's Puzzleknot; Metalwork Colossus; Miasmic Mummy; Midnight Oil; Midnight Scavengers; Mind's Dilation; Mindwrack Demon; Minister of Inquiries; Minotaur Skullcleaver; Minotaur Sureshot; Mirage Mirror; Mirrorwing Dragon; Mobile Garrison; Mockery of Nature; Monstrous Onslaught; Moonlight Hunt; Morkrut Necropod; Mournwillow; Mouth // Feed; Mugging; Murderer's Axe; Murmuring Phantasm; Naga Oracle; Naga Vitalist; Nahiri's Wrath; Nahiri, the Harbinger; Narnam Cobra; Narnam Renegade; Nature's Way; Nearheath Chaplain; Nebelgast Herald; Nef-Crop Entangler; Neglected Heirloom; Neheb, the Eternal; Neheb, the Worthy; Nest of Scarabs; Never // Return; New Perspectives; Nicol Bolas, God-Pharaoh; Night Market Aeronaut; Night Market Lookout; Nightmare; Nimble Innovator; Nimble Obstructionist; Nimble-Blade Khenra; Nimbus Swimmer; Nissa, Steward of Elements; Nissa, Vital Force; Noose Constrictor; Noosegraf Mob; Notion Thief; Noxious Gearhulk; Nyx-Fleece Ram; Nyx Weaver; Oashra Cultivator; Oasis Ritualist; Oath of Ajani; Obelisk Spider; Obsessive Skinner; Odric, Lunarch Marshal; Ogre Battledriver; Ogre Slumlord; Ojutai's Command; Ojutai's Summons; Oketra the True; Oketra's Attendant; Oketra's Avenger; Oketra's Monument; Olivia's Bloodsworn; Olivia's Dragoon; Olivia, Mobilized for War; Ominous Sphinx; Ongoing Investigation; Onward // Victory; Open Fire; Ornamental Courage; Ornery Kudu; Ornithopter; Outland Boar; Outnumber; Ovalchase Dragster; Overwhelming Splendor; Oviya Pashiri, Sage Lifecrafter; Pacification Array; Pack Guardian; Pack Rat; Padeem, Consul of Innovation; Panharmonicon; Paradox Engine; Paradoxical Outcome; Path of Bravery; Pathmaker Initiate; Patron of the Valiant; Peacewalker Colossus; Peel from Reality; Peema Aether-Seer; Peema Outrider; Perilous Vault; Permeating Mass; Phyrexian Revoker; Pia Nalaar; Pick the Brain; Pieces of the Puzzle; Pilgrim's Eye; Pitiless Vizier; Planar Bridge; Pore Over the Pages; Port Town; Possibility Storm; Pouncing Cheetah; Prakhata Pillar-Bug; Precise Strike; Predatory Sliver; Prepare // Fight; Prescient Chimera; Pride Sovereign; Primeval Bounty; Prized Amalgam; Propeller Pioneer; Protection of the Hekma; Prowling Serpopard; Pull from Tomorrow; Puncturing Blow; Puncturing Light; Pursue Glory; Putrefy; Pyre Hound; Quarry Hauler; Quicksmith Genius; Quicksmith Rebel; Rageblood Shaman; Rags // Riches; Raise Dead; Ramunap Excavator; Ramunap Ruins; Rashmi, Eternities Crafter; Ratchet Bomb; Rattlechains; Ravenous Bloodseeker; Ravenous Intruder; Razaketh, the Foulblooded; Reaper of Flight Moonsilver; Reason // Believe; Reckless Fireweaver; Reckless Racer; Reckless Scholar; Reduce // Rubble; Refurbish; Refuse // Cooperate; Regal Caracal; Relentless Dead; Renegade Map; Renegade Rallier; Renegade Tactics; Renegade Wheelsmith; Renewed Faith; Reservoir Walker; Resilient Khenra; Restoration Gearsmith; Restoration Specialist; Return to the Ranks; Reverse Engineer; Revoke Privileges; Revolutionary Rebuff; Rhonas the Indomitable; Rhonas's Monument; Rhonas's Stalwart; Riddle of Lightning; Ridgescale Tusker; Riparian Tiger; Rise from the Tides; Rise of the Dark Realms; Rishkar's Expertise; Rishkar, Peema Renegade; River Hoopoe; Rogue Refiner; Ruin Rat; Ruinous Gremlin; Rumbling Baloth; Runeclaw Bear; Runed Servitor; Rush of Adrenaline; Rush of Vitality; Ruthless Disposal; Ruthless Sniper; Sacred Cat; Sage of Ancient Lore; Sage of Shaila's Claim; Saheeli Rai; Salivating Gremlins; Samut, the Tested; Samut, Voice of Dissent; Sand Strangler; Sandsteppe Outcast; Sandwurm Convergence; Sanguine Bond; Sarkhan's Rage; Scarab Feast; Scattered Groves; Scavenger Grounds; Scour the Laboratory; Scourge Wolf; Scrap Trawler; Scrapheap Scrounger; Scrapper Champion; Seasons Past; Second Harvest; Seeker of Insight; Seer of the Last Tomorrow; Seismic Elemental; Seismic Rupture; Select for Inspection; Self-Assembler; Selfless Cathar; Selfless Spirit; Sengir Vampire; Sentinel Sliver; Servant of the Conduit; Servant of the Scale; Servo Exhibition; Servo Schematic; Shadow of the Grave; Shadowstorm Vizier; Shambleshark; Shambling Goblin; Shard of Broken Glass; Shed Weakness; Shefet Dunes; Shefet Monitor; Sheltered Thicket; Shielded Aether Thief; Shimmerscale Drake; Shipwreck Moray; Shiv's Embrace; Shreds of Sanity; Shrewd Negotiation; Shrill Howler; Sidewinder Naga; Siege Dragon; Siege Modification; Sifter Wurm; Sigarda's Aid; Sigarda, Heron's Grace; Sigardian Priest; Sigil of the Empty Throne; Sigil of Valor; Sigiled Starfish; Sign in Blood; Silumgar's Command; Sin Prodder; Sixth Sense; Sky Skiff; Skyship Plunderer; Skyship Stalker; Skysovereign, Consul Flagship; Skywhaler's Shot; Slate Street Ruffian; Slayer's Plate; Slither Blade; Sliver Hive; Sly Requisitioner; Smuggler's Copter; Solemnity; Solitary Camel; Somberwald Stag; Sorin, Grim Nemesis; Soul of the Harvest; Soul Separator; Soul-Scar Mage; Soulblade Djinn; Soulstinger; Spectral Shepherd; Speedway Fanatic; Spell Queller; Spellweaver Eternal; Sphinx's Revelation; Spire of Industry; Spire Patrol; Spireside Infiltrator; Spirit of the Hunt; Splendid Agony; Spontaneous Mutation; Sporemound; Spring // Mind; Springleaf Drum; Sram's Expertise; Sram, Senior Edificer; Stab Wound; Start // Finish; Startled Awake; Steadfast Cathar; Steelform Sliver; Stensia Masquerade; Steward of Solidarity; Stinging Shot; Stitcher's Graft; Stitchwing Skaab; Stormfront Pegasus; Strength of Arms; Striking Sliver; Striped Riverwinder; Stromkirk Condemned; Stromkirk Occultist; Struggle // Survive; Subjugator Angel; Summary Dismissal; Sunscorched Desert; Sunscourge Champion; Sunset Pyramid; Supernatural Stamina; Supply Caravan; Supreme Will; Swan Song; Sweatworks Brawler; Sweep Away; Sweltering Suns; Swift Spinner; Synchronized Strike; Tah-Crop Elite; Tajuru Pathwarden; Take Inventory; Tamiyo's Journal; Tamiyo, Field Researcher; Tandem Tactics; Tattered Haunter; Temmet, Vizier of Naktamun; Terrarion; Tezzeret the Schemer; Tezzeret's Ambition; Tezzeret's Touch; Thalia's Lancers; Thalia's Lieutenant; Thalia, Heretic Cathar; The Gitrog Monster; The Locust God; The Scarab God; The Scorpion God; Thing in the Ice; Thopter Arrest; Thorned Moloch; Those Who Serve; Thoughtseize; Thraben Foulbloods; Thraben Inspector; Thraben Standard Bearer; Thresher Lizard; Thriving Rhino; Thriving Turtle; Throne of the God-Pharaoh; Thunderbreak Regent; Tightening Coils; Toolcraft Exemplar; Topplegeist; Torch Fiend; Torment of Hailfire; Torment of Scarabs; Torrential Gearhulk; Town Gossipmonger; Traverse the Ulvenwald; Treasure Keeper; Tree of Perdition; Trespasser's Curse; Trial of Ambition; Trial of Knowledge; Trial of Solidarity; Trial of Strength; Trial of Zeal; Triskaidekaphobia; Trophy Mage; True-Faith Censer; Typhoid Rats; Ulamog, the Ceaseless Hunger; Ulrich of the Krallenhorde; Ulrich's Kindred; Ulvenwald Captive; Ulvenwald Hydra; Ulvenwald Mysteries; Unbridled Growth; Unburden; Unconventional Tactics; Underhanded Designs; Unesh, Criosphinx Sovereign; Universal Solvent; Unlicensed Disintegration; Unquenchable Thirst; Untethered Express; Vampiric Rites; Vengeful Rebel; Verdurous Gearhulk; Vessel of Nascency; Veteran Cathar; Veteran Motorist; Vile Manifestation; Village Messenger; Virulent Plague; Visionary Augmenter; Vizier of Deferment; Vizier of Many Faces; Vizier of Remedies; Vizier of the Anointed; Vizier of the Menagerie; Vizier of Tumbling Sands; Voldaren Pariah; Voltaic Brawler; Voyage's End; Wailing Ghoul; Wall of Forgotten Pharaohs; Wander in Death; Warfire Javelineer; Wasp of the Bitter End; Waste Not; Wasteland Scorpion; Watchers of the Dead; Watchful Naga; Wayward Servant; Weaponcraft Enthusiast; Weaver of Lightning; Weirded Vampire; Weirding Wood; Weldfast Engineer; Weldfast Monitor; Weldfast Wingsmith; Welding Sparks; Westvale Abbey; Wharf Infiltrator; Whelming Wave; Whir of Invention; Whirler Rogue; Whirler Virtuoso; Whirlermaker; Wight of Precinct Six; Wild Wanderer; Wild-Field Scarecrow; Wildest Dreams; Wind-Kin Raiders; Winding Constrictor; Winds of Rebuke; Winged Shepherd; Wispweaver Angel; Witch's Familiar; Woodborn Behemoth; Woodweaver's Puzzleknot; Workshop Assistant; Wretched Gryff; Yahenni's Expertise; Yahenni, Undying Partisan; Young Pyromancer; Zada, Hedron Grinder; Zealot of the God-Pharaoh; Zendikar's Roil; Abrupt Decay; Back for More; Bedevil; Buried in the Garden; Clear Shot; Crackle with Power; Decisive Denial; Detention Sphere; Electrodominance; Endless Detour; Essence Capture; Fierce Retribution; Fling; Heartless Pillage; Humiliate; Hypothesizzle; Ionize; Leyline Binding; Murder; Outlaws' Merriment; Primal Might; Ride Down; Savage Smash; Siphon Insight; Skewer the Critics; Skullcrack; Tyrant's Scorn; Unlicensed Hearse; Vanishing Verse; Villainous Wealth; Void Rend diff --git a/forge-gui/res/formats/Archived/Historic/2024-09-24.txt b/forge-gui/res/formats/Archived/Historic/2024-09-24.txt new file mode 100644 index 00000000000..38f74dfedf9 --- /dev/null +++ b/forge-gui/res/formats/Archived/Historic/2024-09-24.txt @@ -0,0 +1,8 @@ +[format] +Name:Historic (DSK) +Type:Archived +Subtype:Arena +Effective:2024-09-24 +Sets:KTK, XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE, SIR, SIS, MOM, MUL, MAT, LTR, HA7, EA3, WOE, WOT, YWOE, LCI, YLCI, MKM, YMKM, OTJ, OTP, BIG, YOTJ, MH3, BLB, YBLB, DSK +Banned:Agent of Treachery; Arid Mesa; Blood Moon; Bloodstained Mire; Brainstorm; Channel; Commandeer; Counterspell; Dark Ritual; Demonic Tutor; Endurance; Field of the Dead; Flare of Cultivation; Flare of Denial; Flare of Duplication; Flare of Fortitude; Flare of Malice; Flooded Strand; Force of Vigor; Fury; Grief; Harbinger of the Seas; Intruder Alarm; Land Tax; Lightning Bolt; Mana Drain; Marsh Flats; Memory Lapse; Mishra's Bauble; Misty Rainforest; Natural Order; Necropotence; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Ragavan, Nimble Pilferer; Reanimate; Scalding Tarn; Show and Tell; Sneak Attack; Solitude; Spreading Seas; Subtlety; Swords to Plowshares; Thassa's Oracle; Tibalt's Trickery; Time Warp; Uro, Titan of Nature's Wrath; Veil of Summer; Verdant Catacombs; Wilderness Reclamation; Windswept Heath; Winter Moon; Wooded Foothills +Additional:Admiral Brass, Unsinkable; Burden of Guilt; Clavileño, First of the Blessed; Crashing Footfalls; Desert; Desertion; Dismember; Duskmantle, House of Shadow; Enlisted Wurm; Evolutionary Leap; Fabricate; Gamble; Ghostly Prison; Gonti, Canny Acquisitor; Goro-Goro and Satoru; Ixidor, Reality Sculptor; Katilda and Lier; Kuldotha Rebirth; Leonin Relic-Warder; Magmaw; Mass Hysteria; Metalspinner's Puzzleknot; Mistveil Plains; Molten Psyche; Monologue Tax; Mystery Key; Mystic Snake; Notion Thief; Nyx Weaver; Olivia, Opulent Outlaw; Pantlaza, Sun-Favored; Persist; Port Razer; Possibility Storm; Prismatic Ending; Prismatic Vista; Putrid Warrior; Shard of Broken Glass; Slimefoot and Squee; Smuggler's Copter; Spell Snare; Stella Lee, Wild Card; Stoneforge Mystic; Timeless Dragon; Treacherous Terrain; Victimize; Xolatoyac, the Smiling Flood; Yuma, Proud Protector diff --git a/forge-gui/res/formats/Archived/Legacy/2024-09-27.txt b/forge-gui/res/formats/Archived/Legacy/2024-09-27.txt new file mode 100644 index 00000000000..2bbeb708ee2 --- /dev/null +++ b/forge-gui/res/formats/Archived/Legacy/2024-09-27.txt @@ -0,0 +1,8 @@ +[format] +Name:Legacy (DSK) +Type:Archived +Subtype:Legacy +Effective:2024-09-27 +Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2, DSK, DSC +Banned:"Lifetime" Pass Holder; _____ _____ _____ Trespasser; _____ _____ Rocketship; _____ Balls of Fire; _____ Bird Gets the Worm; _____ Goblin; _____-o-saurus; Adriana's Valor; Advantageous Proclamation; Aerialephant; Ambassador Blorpityblorpboop; Amulet of Quoz; Ancestral Recall; Arcum's Astrolabe; Assemble the Rank and Vile; Baaallerina; Backup Plan; Balance; Bazaar of Baghdad; Bioluminary; Black Lotus; Brago's Favor; Bronze Tablet; Carnival Carnivore; Channel; Chaos Orb; Chicken Troupe; Clandestine Chameleon; Cleanse; Coming Attraction; Command Performance; Complaints Clerk; Contract from Below; Crusade; Darkpact; Deadbeat Attendant; Deathrite Shaman; Dee Kay, Finder of the Lost; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Discourtesy Clerk; Done for the Day; Double Stroke; Draconian Gate-Bot; Dreadhorde Arcanist; Earthcraft; Echoing Boon; Emissary's Ploy; Expressive Iteration; Falling Star; Fastbond; Fight the _____ Fight; Finishing Move; Flash; Frantic Search; Gitaxian Probe; Glitterflitter; Goblin Recruiter; Grief; Gush; Hermit Druid; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imperial Seal; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Last Voyage of the _____; Library of Alexandria; Line Cutter; Lineprancers; Lurrus of the Dream-Den; Make a _____ Splash; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Minotaur de Force; Mishra's Workshop; Monitor Monitor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Muzzio's Preparations; Myra the Magnificent; Mystical Tutor; Natural Unity; Necropotence; Oath of Druids; Oko, Thief of Crowns; Park Bleater; Petting Zookeeper; Pin Collection; Power Play; Pradesh Gypsies; Prize Wall; Proficient Pyrodancer; Quick Fixer; Rad Rascal; Ragavan, Nimble Pilferer; Rebirth; Ride Guide; Robo-Piñata; Roxi, Publicist to the Stars; Scampire; Seasoned Buttoneer; Secret Summoning; Secrets of Paradise; Sensei's Divining Top; Sentinel Dispatch; Shahrazad; Skullclamp; Sol Ring; Soul Swindler; Sovereign's Realm; Spinnerette, Arachnobat; Squirrel Squatters; Step Right Up; Stiltstrider; Stone-Throwing Devils; Strip Mine; Summoner's Bond; Survival of the Fittest; Sword-Swallowing Seraph; Tempest Efreet; The Most Dangerous Gamer; Ticketomaton; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Tusk and Whiskers; Underworld Breach; Unexpected Potential; Vampiric Tutor; Weight Advantage; Wheel of Fortune; White Plume Adventurer; Wicker Picker; Windfall; Wizards of the _____; Wolf in _____ Clothing; Worldknit; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker +Additional:Aisha of Sparks and Smoke; Arden Angel; Arvinox, the Mind Flail; Baldin, Century Herdmaster; Bjorna, Nightfall Alchemist; Blanka, Ferocious Friend; Cecily, Haunted Mage; Chief Jim Hopper; Chun-Li, Countless Kicks; Daryl, Hunter of Walkers; Dhalsim, Pliable Pacifist; Doric, Nature's Warden; Dustin, Gadget Genius; E. Honda, Sumo Champion; Edgin, Larcenous Lutenist; Eleven, the Mage; Elmar, Ulvenwald Informant; Enkira, Hostile Scavenger; Forge, Neverwinter Charlatan; Gisa's Favorite Shovel; Glenn, the Voice of Calm; Gregor, Shrewd Magistrate; Greymond, Avacyn's Stalwart; Guile, Sonic Soldier; Hansk, Slayer Zealot; Hargilde, Kindly Runechanter; Havengul Laboratory; Hawkins National Laboratory; Holga, Relentless Rager; Immard, the Stormcleaver; Ken, Burning Brawler; Lara Croft, Tomb Raider; Lucas, the Sharpshooter; Lucille; Maarika, Brutal Gladiator; Malik, Grim Manipulator; Max, the Daredevil; Michonne, Ruthless Survivor; Mike, the Dungeon Master; Mind Flayer, the Shadow; Negan, the Cold-Blooded; Othelm, Sigardian Outcast; Rick, Steadfast Leader; Rose Noble; Ryu, World Warrior; Simon, Wild Magic Sorcerer; Sophina, Spearsage Deserter; Tadeas, Juniper Ascendant; The Celestial Toymaker; The Fifteenth Doctor; The Fourteenth Doctor; The Howling Abomination; Themberchaud; The Meep; Vikya, Scorching Stalwart; Wernog, Rider's Chaplain; Will the Wise; Xenk, Paladin Unbroken; Zangief, the Red Cyclone; Zethi, Arcane Blademaster diff --git a/forge-gui/res/formats/Archived/Modern/2024-09-27.txt b/forge-gui/res/formats/Archived/Modern/2024-09-27.txt new file mode 100644 index 00000000000..1155013ada9 --- /dev/null +++ b/forge-gui/res/formats/Archived/Modern/2024-09-27.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern (DSK) +Type:Archived +Subtype:Modern +Effective:2024-09-27 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, DPA, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, MMA, M14, THS, BNG, JOU, MD1, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, MM3, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, GK1, G18, RNA, GK2, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, MH2, AFR, MID, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, LTR, WOE, LCI, MKM, OTJ, BIG, MH3, ACR, BLB, DSK +Banned:Ancient Den; Arcum's Astrolabe; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Field of the Dead; Fury; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Grief; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Lurrus of the Dream-Den; Mental Misstep; Mox Opal; Mycosynth Lattice; Mystic Sanctuary; Nadu, Winged Wisdom; Oko, Thief of Crowns; Once Upon a Time; Ponder; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Simian Spirit Guide; Skullclamp; Splinter Twin; Summer Bloom; Tibalt's Trickery; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Up the Beanstalk; Uro, Titan of Nature's Wrath; Vault of Whispers; Violent Outburst; Yorion, Sky Nomad diff --git a/forge-gui/res/formats/Archived/Pioneer/2024-09-27.txt b/forge-gui/res/formats/Archived/Pioneer/2024-09-27.txt new file mode 100644 index 00000000000..fd56aba9ca5 --- /dev/null +++ b/forge-gui/res/formats/Archived/Pioneer/2024-09-27.txt @@ -0,0 +1,7 @@ +[format] +Name:Pioneer (DSK) +Type:Archived +Subtype:Pioneer +Effective:2024-09-27 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, Q06, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB, DSK +Banned:Amalia Benavides Aguirre; Balustrade Spy; Bloodstained Mire; Expressive Iteration; Felidar Guardian; Field of the Dead; Flooded Strand; Geological Appraiser; Inverter of Truth; Karn, the Great Creator; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Sorin, Imperious Bloodlord; Teferi, Time Raveler; Undercity Informer; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Walking Ballista; Wilderness Reclamation; Windswept Heath; Winota, Joiner of Forces; Wooded Foothills diff --git a/forge-gui/res/formats/Archived/Standard/2024-09-27.txt b/forge-gui/res/formats/Archived/Standard/2024-09-27.txt new file mode 100644 index 00000000000..ce543f1aad1 --- /dev/null +++ b/forge-gui/res/formats/Archived/Standard/2024-09-27.txt @@ -0,0 +1,6 @@ +[format] +Name:Standard (DSK) +Type:Archived +Subtype:Standard +Effective:2024-09-27 +Sets:DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB, DSK diff --git a/forge-gui/res/formats/Archived/Timeless/2024-09-24.txt b/forge-gui/res/formats/Archived/Timeless/2024-09-24.txt new file mode 100644 index 00000000000..eedb2a3838d --- /dev/null +++ b/forge-gui/res/formats/Archived/Timeless/2024-09-24.txt @@ -0,0 +1,8 @@ +[format] +Name:Timeless (DSK) +Type:Archived +Subtype:Vintage +Effective:2024-09-24 +Sets:KTK, XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE, SIR, SIS, MOM, MUL, MAT, LTR, HA7, EA3, WOE, WOT, YWOE, LCI, YLCI, MKM, YMKM, OTJ, OTP, BIG, YOTJ, MH3, BLB, YBLB, DSK +Restricted:Channel; Demonic Tutor; Tibalt's Trickery +Additional:Admiral Brass, Unsinkable; Burden of Guilt; Clavileño, First of the Blessed; Crashing Footfalls; Desert; Desertion; Dismember; Duskmantle, House of Shadow; Endurance; Enlisted Wurm; Evolutionary Leap; Fabricate; Fury; Gamble; Ghostly Prison; Gonti, Canny Acquisitor; Goro-Goro and Satoru; Grief; Ixidor, Reality Sculptor; Katilda and Lier; Kuldotha Rebirth; Leonin Relic-Warder; Magmaw; Mass Hysteria; Metalspinner's Puzzleknot; Mistveil Plains; Molten Psyche; Monologue Tax; Mystery Key; Mystic Snake; Notion Thief; Nyx Weaver; Olivia, Opulent Outlaw; Pantlaza, Sun-Favored; Persist; Port Razer; Possibility Storm; Prismatic Ending; Prismatic Vista; Putrid Warrior; Shard of Broken Glass; Show and Tell; Slimefoot and Squee; Smuggler's Copter; Solitude; Spell Snare; Stella Lee, Wild Card; Stoneforge Mystic; Subtlety; Timeless Dragon; Treacherous Terrain; Victimize; Xolatoyac, the Smiling Flood; Yuma, Proud Protector diff --git a/forge-gui/res/formats/Archived/Vintage/2024-09-27.txt b/forge-gui/res/formats/Archived/Vintage/2024-09-27.txt new file mode 100644 index 00000000000..71adba19815 --- /dev/null +++ b/forge-gui/res/formats/Archived/Vintage/2024-09-27.txt @@ -0,0 +1,9 @@ +[format] +Name:Vintage (DSK) +Type:Archived +Subtype:Vintage +Effective:2024-09-27 +Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2, DSK, DSC +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Sol Ring; Strip Mine; Thorn of Amethyst; Time Vault; Time Walk; Timetwister; Tinker; Tolarian Academy; Treasure Cruise; Trinisphere; Urza's Saga; Vampiric Tutor; Vexing Bauble; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:"Lifetime" Pass Holder; _____ _____ _____ Trespasser; _____ _____ Rocketship; _____ Balls of Fire; _____ Bird Gets the Worm; _____ Goblin; _____-o-saurus; Adriana's Valor; Advantageous Proclamation; Aerialephant; Ambassador Blorpityblorpboop; Amulet of Quoz; Assemble the Rank and Vile; Baaallerina; Backup Plan; Bioluminary; Brago's Favor; Bronze Tablet; Carnival Carnivore; Chaos Orb; Chicken Troupe; Clandestine Chameleon; Cleanse; Coming Attraction; Command Performance; Complaints Clerk; Contract from Below; Crusade; Darkpact; Deadbeat Attendant; Dee Kay, Finder of the Lost; Demonic Attorney; Discourtesy Clerk; Done for the Day; Double Stroke; Draconian Gate-Bot; Echoing Boon; Emissary's Ploy; Falling Star; Fight the _____ Fight; Finishing Move; Glitterflitter; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Last Voyage of the _____; Line Cutter; Lineprancers; Make a _____ Splash; Minotaur de Force; Monitor Monitor; Muzzio's Preparations; Myra the Magnificent; Natural Unity; Park Bleater; Petting Zookeeper; Pin Collection; Power Play; Pradesh Gypsies; Prize Wall; Proficient Pyrodancer; Quick Fixer; Rad Rascal; Rebirth; Ride Guide; Robo-Piñata; Roxi, Publicist to the Stars; Scampire; Seasoned Buttoneer; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Shahrazad; Soul Swindler; Sovereign's Realm; Spinnerette, Arachnobat; Squirrel Squatters; Step Right Up; Stiltstrider; Stone-Throwing Devils; Summoner's Bond; Sword-Swallowing Seraph; Tempest Efreet; The Most Dangerous Gamer; Ticketomaton; Timmerian Fiends; Tusk and Whiskers; Unexpected Potential; Weight Advantage; Wicker Picker; Wizards of the _____; Wolf in _____ Clothing; Worldknit +Additional:Aisha of Sparks and Smoke; Arden Angel; Arvinox, the Mind Flail; Baldin, Century Herdmaster; Bjorna, Nightfall Alchemist; Blanka, Ferocious Friend; Cecily, Haunted Mage; Chief Jim Hopper; Chun-Li, Countless Kicks; Daryl, Hunter of Walkers; Dhalsim, Pliable Pacifist; Doric, Nature's Warden; Dustin, Gadget Genius; E. Honda, Sumo Champion; Edgin, Larcenous Lutenist; Eleven, the Mage; Elmar, Ulvenwald Informant; Enkira, Hostile Scavenger; Forge, Neverwinter Charlatan; Gisa's Favorite Shovel; Glenn, the Voice of Calm; Gregor, Shrewd Magistrate; Greymond, Avacyn's Stalwart; Guile, Sonic Soldier; Hansk, Slayer Zealot; Hargilde, Kindly Runechanter; Havengul Laboratory; Hawkins National Laboratory; Holga, Relentless Rager; Immard, the Stormcleaver; Ken, Burning Brawler; Lara Croft, Tomb Raider; Lucas, the Sharpshooter; Lucille; Maarika, Brutal Gladiator; Malik, Grim Manipulator; Max, the Daredevil; Michonne, Ruthless Survivor; Mike, the Dungeon Master; Mind Flayer, the Shadow; Negan, the Cold-Blooded; Othelm, Sigardian Outcast; Rick, Steadfast Leader; Rose Noble; Ryu, World Warrior; Simon, Wild Magic Sorcerer; Sophina, Spearsage Deserter; Tadeas, Juniper Ascendant; The Celestial Toymaker; The Fifteenth Doctor; The Fourteenth Doctor; The Howling Abomination; Themberchaud; The Meep; Vikya, Scorching Stalwart; Wernog, Rider's Chaplain; Will the Wise; Xenk, Paladin Unbroken; Zangief, the Red Cyclone; Zethi, Arcane Blademaster diff --git a/forge-gui/res/formats/Casual/Brawl.txt b/forge-gui/res/formats/Casual/Brawl.txt index 6aa348e86bc..aa7ec8f6ecb 100644 --- a/forge-gui/res/formats/Casual/Brawl.txt +++ b/forge-gui/res/formats/Casual/Brawl.txt @@ -3,5 +3,5 @@ Name:Brawl Order:101 Type:Casual Subtype:Commander -Sets:DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB +Sets:DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB, DSK Additional:Arcane Signet; Command Tower diff --git a/forge-gui/res/formats/Sanctioned/Historic.txt b/forge-gui/res/formats/Sanctioned/Historic.txt index fa3b9bba362..86df4963dca 100644 --- a/forge-gui/res/formats/Sanctioned/Historic.txt +++ b/forge-gui/res/formats/Sanctioned/Historic.txt @@ -4,6 +4,6 @@ Type:Digital Subtype:Arena Effective:2019-11-21 Order:142 -Sets:KTK, XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE, SIR, SIS, MOM, MUL, MAT, LTR, HA7, EA3, WOE, WOT, YWOE, LCI, YLCI, MKM, YMKM, OTJ, OTP, BIG, YOTJ, MH3, BLB, YBLB +Sets:KTK, XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AJMP, AKR, ANB, ZNR, KLR, KHM, HA4, STX, STA, HA5, AFR, J21, MID, VOW, YMID, NEO, YNEO, SNC, YSNC, HBG, HA6, EA1, DMU, YDMU, BRO, BRR, YBRO, EA2, ONE, YONE, SIR, SIS, MOM, MUL, MAT, LTR, HA7, EA3, WOE, WOT, YWOE, LCI, YLCI, MKM, YMKM, OTJ, OTP, BIG, YOTJ, MH3, BLB, YBLB, DSK Banned:Agent of Treachery; Arid Mesa; Blood Moon; Bloodstained Mire; Brainstorm; Channel; Commandeer; Counterspell; Dark Ritual; Demonic Tutor; Endurance; Field of the Dead; Flare of Cultivation; Flare of Denial; Flare of Duplication; Flare of Fortitude; Flare of Malice; Flooded Strand; Force of Vigor; Fury; Grief; Harbinger of the Seas; Intruder Alarm; Land Tax; Lightning Bolt; Mana Drain; Marsh Flats; Memory Lapse; Mishra's Bauble; Misty Rainforest; Natural Order; Necropotence; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Ragavan, Nimble Pilferer; Reanimate; Scalding Tarn; Show and Tell; Sneak Attack; Solitude; Spreading Seas; Subtlety; Swords to Plowshares; Thassa's Oracle; Tibalt's Trickery; Time Warp; Uro, Titan of Nature's Wrath; Veil of Summer; Verdant Catacombs; Wilderness Reclamation; Windswept Heath; Winter Moon; Wooded Foothills Additional:Admiral Brass, Unsinkable; Burden of Guilt; Clavileño, First of the Blessed; Crashing Footfalls; Desert; Desertion; Dismember; Duskmantle, House of Shadow; Enlisted Wurm; Evolutionary Leap; Fabricate; Gamble; Ghostly Prison; Gonti, Canny Acquisitor; Goro-Goro and Satoru; Ixidor, Reality Sculptor; Katilda and Lier; Kuldotha Rebirth; Leonin Relic-Warder; Magmaw; Mass Hysteria; Metalspinner's Puzzleknot; Mistveil Plains; Molten Psyche; Monologue Tax; Mystery Key; Mystic Snake; Notion Thief; Nyx Weaver; Olivia, Opulent Outlaw; Pantlaza, Sun-Favored; Persist; Port Razer; Possibility Storm; Prismatic Ending; Prismatic Vista; Putrid Warrior; Shard of Broken Glass; Slimefoot and Squee; Smuggler's Copter; Spell Snare; Stella Lee, Wild Card; Stoneforge Mystic; Timeless Dragon; Treacherous Terrain; Victimize; Xolatoyac, the Smiling Flood; Yuma, Proud Protector diff --git a/forge-gui/res/formats/Sanctioned/Legacy.txt b/forge-gui/res/formats/Sanctioned/Legacy.txt index ee3e855f997..260659a4b81 100644 --- a/forge-gui/res/formats/Sanctioned/Legacy.txt +++ b/forge-gui/res/formats/Sanctioned/Legacy.txt @@ -3,5 +3,5 @@ Name:Legacy Order:105 Subtype:Legacy Type:Sanctioned -Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, SLD, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, SLX, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, SPG, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2 +Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, SLD, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, SLX, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, SPG, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2, DSK, DSC Banned:"Lifetime" Pass Holder; _____ _____ _____ Trespasser; _____ _____ Rocketship; _____ Balls of Fire; _____ Bird Gets the Worm; _____ Goblin; _____-o-saurus; Adriana's Valor; Advantageous Proclamation; Aerialephant; Ambassador Blorpityblorpboop; Amulet of Quoz; Ancestral Recall; Arcum's Astrolabe; Assemble the Rank and Vile; Baaallerina; Backup Plan; Balance; Bazaar of Baghdad; Bioluminary; Black Lotus; Brago's Favor; Bronze Tablet; Carnival Carnivore; Channel; Chaos Orb; Chicken Troupe; Clandestine Chameleon; Cleanse; Coming Attraction; Command Performance; Complaints Clerk; Contract from Below; Crusade; Darkpact; Deadbeat Attendant; Deathrite Shaman; Dee Kay, Finder of the Lost; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Discourtesy Clerk; Done for the Day; Double Stroke; Draconian Gate-Bot; Dreadhorde Arcanist; Earthcraft; Echoing Boon; Emissary's Ploy; Expressive Iteration; Falling Star; Fastbond; Fight the _____ Fight; Finishing Move; Flash; Frantic Search; Gitaxian Probe; Glitterflitter; Goblin Recruiter; Grief; Gush; Hermit Druid; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imperial Seal; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Last Voyage of the _____; Library of Alexandria; Line Cutter; Lineprancers; Lurrus of the Dream-Den; Make a _____ Splash; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Minotaur de Force; Mishra's Workshop; Monitor Monitor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Muzzio's Preparations; Myra the Magnificent; Mystical Tutor; Natural Unity; Necropotence; Oath of Druids; Oko, Thief of Crowns; Park Bleater; Petting Zookeeper; Pin Collection; Power Play; Pradesh Gypsies; Prize Wall; Proficient Pyrodancer; Quick Fixer; Rad Rascal; Ragavan, Nimble Pilferer; Rebirth; Ride Guide; Robo-Piñata; Roxi, Publicist to the Stars; Scampire; Seasoned Buttoneer; Secret Summoning; Secrets of Paradise; Sensei's Divining Top; Sentinel Dispatch; Shahrazad; Skullclamp; Sol Ring; Soul Swindler; Sovereign's Realm; Spinnerette, Arachnobat; Squirrel Squatters; Step Right Up; Stiltstrider; Stone-Throwing Devils; Strip Mine; Summoner's Bond; Survival of the Fittest; Sword-Swallowing Seraph; Tempest Efreet; The Most Dangerous Gamer; Ticketomaton; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Tusk and Whiskers; Underworld Breach; Unexpected Potential; Vampiric Tutor; Weight Advantage; Wheel of Fortune; White Plume Adventurer; Wicker Picker; Windfall; Wizards of the _____; Wolf in _____ Clothing; Worldknit; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker diff --git a/forge-gui/res/formats/Sanctioned/Modern.txt b/forge-gui/res/formats/Sanctioned/Modern.txt index be4aa19aa26..83c76b7a60d 100644 --- a/forge-gui/res/formats/Sanctioned/Modern.txt +++ b/forge-gui/res/formats/Sanctioned/Modern.txt @@ -3,5 +3,5 @@ Name:Modern Order:103 Subtype:Modern Type:Sanctioned -Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, DPA, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, MMA, M14, THS, BNG, JOU, MD1, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, MM3, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, GK1, G18, RNA, GK2, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, MH2, AFR, MID, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, LTR, WOE, LCI, MKM, OTJ, BIG, MH3, ACR, BLB +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, DPA, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, MMA, M14, THS, BNG, JOU, MD1, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, MM3, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, GK1, G18, RNA, GK2, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, MH2, AFR, MID, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, LTR, WOE, LCI, MKM, OTJ, BIG, MH3, ACR, BLB, DSK Banned:Ancient Den; Arcum's Astrolabe; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Field of the Dead; Fury; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Grief; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Lurrus of the Dream-Den; Mental Misstep; Mox Opal; Mycosynth Lattice; Mystic Sanctuary; Nadu, Winged Wisdom; Oko, Thief of Crowns; Once Upon a Time; Ponder; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Simian Spirit Guide; Skullclamp; Splinter Twin; Summer Bloom; Tibalt's Trickery; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Up the Beanstalk; Uro, Titan of Nature's Wrath; Vault of Whispers; Violent Outburst; Yorion, Sky Nomad diff --git a/forge-gui/res/formats/Sanctioned/Pioneer.txt b/forge-gui/res/formats/Sanctioned/Pioneer.txt index a9ce627ed0a..6374b5981af 100644 --- a/forge-gui/res/formats/Sanctioned/Pioneer.txt +++ b/forge-gui/res/formats/Sanctioned/Pioneer.txt @@ -3,5 +3,5 @@ Name:Pioneer Order:102 Subtype:Pioneer Type:Sanctioned -Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, Q06, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, SOI, W16, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, Q06, VOW, DBL, NEO, SNC, DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB, DSK Banned:Amalia Benavides Aguirre; Balustrade Spy; Bloodstained Mire; Expressive Iteration; Felidar Guardian; Field of the Dead; Flooded Strand; Geological Appraiser; Inverter of Truth; Karn, the Great Creator; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Sorin, Imperious Bloodlord; Teferi, Time Raveler; Undercity Informer; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Walking Ballista; Wilderness Reclamation; Windswept Heath; Winota, Joiner of Forces; Wooded Foothills diff --git a/forge-gui/res/formats/Sanctioned/Standard.txt b/forge-gui/res/formats/Sanctioned/Standard.txt index 3a0649529e4..ef38c9e676b 100644 --- a/forge-gui/res/formats/Sanctioned/Standard.txt +++ b/forge-gui/res/formats/Sanctioned/Standard.txt @@ -3,4 +3,4 @@ Name:Standard Order:101 Subtype:Standard Type:Sanctioned -Sets:DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB +Sets:DMU, BRO, ONE, MOM, MAT, WOE, LCI, MKM, OTJ, BIG, BLB, DSK diff --git a/forge-gui/res/formats/Sanctioned/Vintage.txt b/forge-gui/res/formats/Sanctioned/Vintage.txt index a779f785965..976e0de06a8 100644 --- a/forge-gui/res/formats/Sanctioned/Vintage.txt +++ b/forge-gui/res/formats/Sanctioned/Vintage.txt @@ -3,6 +3,6 @@ Name:Vintage Order:104 Subtype:Vintage Type:Sanctioned -Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, SLD, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, SLX, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, SPG, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2 +Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, HOP, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, ARC, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, PC2, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, PCA, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, E01, HOU, C17, XLN, DDT, IMA, V17, E02, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, SLD, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, Q06, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, SLX, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR, ONE, ONC, MOM, MOC, MUL, MAT, LTR, LTC, CMM, WOE, WOC, WOT, WHO, LCI, LCC, REX, SPG, RVR, MKM, MKC, CLU, PIP, OTJ, OTC, OTP, BIG, MH3, M3C, H2R, ACR, BLB, BLC, MB2, DSK, DSC Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Sol Ring; Strip Mine; Thorn of Amethyst; Time Vault; Time Walk; Timetwister; Tinker; Tolarian Academy; Treasure Cruise; Trinisphere; Urza's Saga; Vampiric Tutor; Vexing Bauble; Wheel of Fortune; Windfall; Yawgmoth's Will Banned:"Lifetime" Pass Holder; _____ _____ _____ Trespasser; _____ _____ Rocketship; _____ Balls of Fire; _____ Bird Gets the Worm; _____ Goblin; _____-o-saurus; Adriana's Valor; Advantageous Proclamation; Aerialephant; Ambassador Blorpityblorpboop; Amulet of Quoz; Assemble the Rank and Vile; Baaallerina; Backup Plan; Bioluminary; Brago's Favor; Bronze Tablet; Carnival Carnivore; Chaos Orb; Chicken Troupe; Clandestine Chameleon; Cleanse; Coming Attraction; Command Performance; Complaints Clerk; Contract from Below; Crusade; Darkpact; Deadbeat Attendant; Dee Kay, Finder of the Lost; Demonic Attorney; Discourtesy Clerk; Done for the Day; Double Stroke; Draconian Gate-Bot; Echoing Boon; Emissary's Ploy; Falling Star; Fight the _____ Fight; Finishing Move; Glitterflitter; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Last Voyage of the _____; Line Cutter; Lineprancers; Make a _____ Splash; Minotaur de Force; Monitor Monitor; Muzzio's Preparations; Myra the Magnificent; Natural Unity; Park Bleater; Petting Zookeeper; Pin Collection; Power Play; Pradesh Gypsies; Prize Wall; Proficient Pyrodancer; Quick Fixer; Rad Rascal; Rebirth; Ride Guide; Robo-Piñata; Roxi, Publicist to the Stars; Scampire; Seasoned Buttoneer; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Shahrazad; Soul Swindler; Sovereign's Realm; Spinnerette, Arachnobat; Squirrel Squatters; Step Right Up; Stiltstrider; Stone-Throwing Devils; Summoner's Bond; Sword-Swallowing Seraph; Tempest Efreet; The Most Dangerous Gamer; Ticketomaton; Timmerian Fiends; Tusk and Whiskers; Unexpected Potential; Weight Advantage; Wicker Picker; Wizards of the _____; Wolf in _____ Clothing; Worldknit From 05bf665f5222976e2b3e3b45b2fde88af06423b6 Mon Sep 17 00:00:00 2001 From: Glorax <114269106+Glorax@users.noreply.github.com> Date: Tue, 17 Sep 2024 13:21:05 -0700 Subject: [PATCH 14/37] Spineseeker Centipede fix (#6166) --- forge-gui/res/cardsfolder/upcoming/spineseeker_centipede.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/spineseeker_centipede.txt b/forge-gui/res/cardsfolder/upcoming/spineseeker_centipede.txt index c4d23d96481..aabaac59537 100644 --- a/forge-gui/res/cardsfolder/upcoming/spineseeker_centipede.txt +++ b/forge-gui/res/cardsfolder/upcoming/spineseeker_centipede.txt @@ -1,10 +1,10 @@ Name:Spineseeker Centipede ManaCost:2 G Types:Creature Insect -PT:2/3 +PT:2/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters, search your library for a basic land card, reveal it, put it into your hand, then shuffle. SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 2 | AddKeyword$ Vigilance | Condition$ Delirium | Description$ Delirium — CARDNAME gets +1/+2 and has vigilance as long as there are four or more card types among cards in your graveyard. DeckHints:Ability$Graveyard|Discard DeckHas:Ability$Delirium -Oracle:When Spineseeker Centipede enters, search your library for a basic land card, reveal it, put it into your hand, then shuffle.\nDelirium — Spineseeker Centipede gets +1/+2 and has vigilance as long as there are four or more card types among cards in your graveyard. \ No newline at end of file +Oracle:When Spineseeker Centipede enters, search your library for a basic land card, reveal it, put it into your hand, then shuffle.\nDelirium — Spineseeker Centipede gets +1/+2 and has vigilance as long as there are four or more card types among cards in your graveyard. From 922a0c21be2a682812dadac72f6daf7ab06ec7ad Mon Sep 17 00:00:00 2001 From: Glorax <114269106+Glorax@users.noreply.github.com> Date: Tue, 17 Sep 2024 13:48:07 -0700 Subject: [PATCH 15/37] Overgrown Zealot fix (#6167) --- forge-gui/res/cardsfolder/upcoming/overgrown_zealot.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/overgrown_zealot.txt b/forge-gui/res/cardsfolder/upcoming/overgrown_zealot.txt index a4535e6770b..753c78a2d1a 100644 --- a/forge-gui/res/cardsfolder/upcoming/overgrown_zealot.txt +++ b/forge-gui/res/cardsfolder/upcoming/overgrown_zealot.txt @@ -1,7 +1,7 @@ Name:Overgrown Zealot ManaCost:1 G Types:Creature Elf Druid -PT:1/1 +PT:0/4 A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 2 | RestrictValid$ Static.isTurnFaceUp | SpellDescription$ Add two mana of any one color. Spend this mana only to turn permanents face up. -Oracle:{T}: Add one mana of any color.\n{T}: Add two mana of any one color. Spend this mana only to turn permanents face up. \ No newline at end of file +Oracle:{T}: Add one mana of any color.\n{T}: Add two mana of any one color. Spend this mana only to turn permanents face up. From 95dd06e55f6c96f9de72b11cfd21a0f2d46f0e32 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Wed, 18 Sep 2024 07:18:06 +0200 Subject: [PATCH 16/37] Ancient Cellarspawn - incomplete, might need support (#6123) * Ancient Cellarspawn - incomplete, might need support * Support Ancient Cellarspawn --------- Co-authored-by: TRT <> --- .../game/trigger/TriggerSpellAbilityCastOrCopy.java | 3 +++ .../res/cardsfolder/b/because_i_have_willed_it.txt | 2 +- .../res/cardsfolder/upcoming/ancient_cellarspawn.txt | 11 +++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/ancient_cellarspawn.txt diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java index 8d4e8483f4b..c940e25f161 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java @@ -139,6 +139,9 @@ public class TriggerSpellAbilityCastOrCopy extends Trigger { if (!matchesValidParam("ValidSA", spellAbility)) { return false; } + if (!matchesValidParam("ValidSAonCard", spellAbility, cast)) { + return false; + } if (hasParam("TargetsValid")) { SpellAbility sa = spellAbility; diff --git a/forge-gui/res/cardsfolder/b/because_i_have_willed_it.txt b/forge-gui/res/cardsfolder/b/because_i_have_willed_it.txt index 34594559395..9f325fd1283 100644 --- a/forge-gui/res/cardsfolder/b/because_i_have_willed_it.txt +++ b/forge-gui/res/cardsfolder/b/because_i_have_willed_it.txt @@ -4,5 +4,5 @@ Types:Ongoing Scheme S:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Card | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Spells you cast cost {1} less to cast. T:Mode$ Phase | Phase$ End Of Turn | ValidPlayer$ Player.Opponent | Execute$ Abandon | TriggerZones$ Command | CheckSVar$ X | SVarCompare$ GE4 | TriggerDescription$ At the beginning of your opponents' end step, if they cast four or more spells this turn, abandon this scheme. SVar:Abandon:DB$ Abandon -SVar:X:Count$ThisTurnCast_Card.YouDontCtrl +SVar:X:Count$ThisTurnCast_Card.ActivePlayerCtrl Oracle:(An ongoing scheme remains face up until it's abandoned.)\nSpells you cast cost {1} less to cast.\nAt the beginning of your opponents' end step, if they cast four or more spells this turn, abandon this scheme. diff --git a/forge-gui/res/cardsfolder/upcoming/ancient_cellarspawn.txt b/forge-gui/res/cardsfolder/upcoming/ancient_cellarspawn.txt new file mode 100644 index 00000000000..ee0474b1a97 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ancient_cellarspawn.txt @@ -0,0 +1,11 @@ +Name:Ancient Cellarspawn +ManaCost:1 B B +Types:Enchantment Creature Horror +PT:3/3 +S:Mode$ ReduceCost | ValidCard$ Demon,Horror,Nightmare | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Each spell you cast that's a Demon, Horror, or Nightmare costs {1} less to cast. +T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | Execute$ TrigLoseLife | TriggerZones$ Battlefield | ValidSAonCard$ Spell.ManaSpent LTX | TriggerDescription$ Whenever you cast a spell, if the amount of mana spent to cast it was less than its mana value, target opponent loses life equal to the difference. +SVar:TrigLoseLife:DB$ LoseLife | ValidTgts$ Opponent | LifeAmount$ SVar$Y/Minus.Z +SVar:X:Count$CardManaCost +SVar:Y:TriggeredCard$CardManaCost +SVar:Z:TriggeredCard$CastTotalManaSpent +Oracle:Each spell you cast that's a Demon, Horror, or Nightmare costs {1} less to cast.\nWhenever you cast a spell, if the amount of mana spent to cast it was less than its mana value, target opponent loses life equal to the difference. \ No newline at end of file From dd0bd28d2c662761f8907886c5b3651b049b3186 Mon Sep 17 00:00:00 2001 From: Glorax <114269106+Glorax@users.noreply.github.com> Date: Tue, 17 Sep 2024 22:24:43 -0700 Subject: [PATCH 17/37] Erratic Apparition fix (#6170) --- forge-gui/res/cardsfolder/upcoming/erratic_apparition.txt | 2 +- forge-gui/res/cardsfolder/upcoming/vicious_clown.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/erratic_apparition.txt b/forge-gui/res/cardsfolder/upcoming/erratic_apparition.txt index b8b227ea1e8..b02ad568f74 100644 --- a/forge-gui/res/cardsfolder/upcoming/erratic_apparition.txt +++ b/forge-gui/res/cardsfolder/upcoming/erratic_apparition.txt @@ -6,6 +6,6 @@ K:Flying K:Vigilance T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gets +1/+1 until end of turn. T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigPump | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gets +1/+1 until end of turn. -SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | NumAtt$ 1 | NumDef$ 1 +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1 DeckNeeds:Type$Enchantment Oracle:Flying, vigilance\nEerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, Erratic Apparition gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/vicious_clown.txt b/forge-gui/res/cardsfolder/upcoming/vicious_clown.txt index 6e70d2d567b..e02dd98555c 100644 --- a/forge-gui/res/cardsfolder/upcoming/vicious_clown.txt +++ b/forge-gui/res/cardsfolder/upcoming/vicious_clown.txt @@ -2,7 +2,7 @@ Name:Vicious Clown ManaCost:2 R Types:Creature Human Clown PT:2/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerLE2+YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever another creature you control with power 2 or less enters, CARDNAME gains flying until end of turn. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerLE2+YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever another creature you control with power 2 or less enters, CARDNAME gets +2/+0 until end of turn. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 2 SVar:BuffedBy:Creature.powerLE2 -Oracle:Whenever another creature you control with power 2 or less enters, Vicious Clown gets +2/+0 until end of turn. \ No newline at end of file +Oracle:Whenever another creature you control with power 2 or less enters, Vicious Clown gets +2/+0 until end of turn. From 7b94f07fa8eeef009c00cf2f9e96ff6126c4e107 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Wed, 18 Sep 2024 07:25:08 +0200 Subject: [PATCH 18/37] DSK cards from misplaced PR (#6157) --- .../i/invasion_of_azgol_ashen_reaper.txt | 2 +- .../res/cardsfolder/upcoming/balemurk_leech.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/broodspinner.txt | 11 +++++++++++ .../res/cardsfolder/upcoming/enter_the_enigma.txt | 7 +++++++ .../res/cardsfolder/upcoming/frantic_strength.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/jump_scare.txt | 6 ++++++ .../cardsfolder/upcoming/kona_rescue_beastie.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/live_or_die.txt | 7 +++++++ .../cardsfolder/upcoming/malevolent_chandelier.txt | 7 +++++++ .../res/cardsfolder/upcoming/manifest_dread.txt | 5 +++++ .../res/cardsfolder/upcoming/rootwise_survivor.txt | 2 +- .../res/cardsfolder/upcoming/spectral_snatcher.txt | 7 +++++++ .../cardsfolder/upcoming/sporogenic_infection.txt | 13 +++++++++++++ .../cardsfolder/upcoming/valgavoths_onslaught.txt | 6 +++--- 14 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/balemurk_leech.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/broodspinner.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/enter_the_enigma.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/frantic_strength.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/jump_scare.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/kona_rescue_beastie.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/live_or_die.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/malevolent_chandelier.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/manifest_dread.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spectral_snatcher.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sporogenic_infection.txt diff --git a/forge-gui/res/cardsfolder/i/invasion_of_azgol_ashen_reaper.txt b/forge-gui/res/cardsfolder/i/invasion_of_azgol_ashen_reaper.txt index 96a7343bf61..b7e804c589d 100644 --- a/forge-gui/res/cardsfolder/i/invasion_of_azgol_ashen_reaper.txt +++ b/forge-gui/res/cardsfolder/i/invasion_of_azgol_ashen_reaper.txt @@ -3,7 +3,7 @@ ManaCost:B R Types:Battle Siege Defense:4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSacrifice | TriggerDescription$ When CARDNAME enters, target player sacrifices a creature or planeswalker and loses 1 life. -SVar:TrigSacrifice:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Creature,Planeswalker | SacMessage$ Creature or Planeswalker | SubAbility$ DBLoseLife +SVar:TrigSacrifice:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Creature,Planeswalker | SacMessage$ creature or planeswalker | SubAbility$ DBLoseLife SVar:DBLoseLife:DB$ LoseLife | Defined$ TargetedPlayer | LifeAmount$ 1 DeckHas:Ability$Sacrifice|Counters AlternateMode:DoubleFaced diff --git a/forge-gui/res/cardsfolder/upcoming/balemurk_leech.txt b/forge-gui/res/cardsfolder/upcoming/balemurk_leech.txt new file mode 100644 index 00000000000..30f3e75c228 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/balemurk_leech.txt @@ -0,0 +1,9 @@ +Name:Balemurk Leech +ManaCost:1 B +Types:Creature Leech +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, each opponent loses 1 life. +T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigLoseLife| TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, each opponent loses 1 life. +SVar:TrigLoseLife:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 +DeckNeeds:Type$Enchantment +Oracle:Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, each opponent loses 1 life. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/broodspinner.txt b/forge-gui/res/cardsfolder/upcoming/broodspinner.txt new file mode 100644 index 00000000000..17c63cb1991 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/broodspinner.txt @@ -0,0 +1,11 @@ +Name:Broodspinner +ManaCost:B G +Types:Creature Spider +PT:2/3 +K:Reach +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSurveil | TriggerDescription$ When CARDNAME enters, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) +SVar:TrigSurveil:DB$ Surveil | Defined$ You | Amount$ 2 +A:AB$ Token | Cost$ 4 B G T Sac<1/CARDNAME> | TokenAmount$ X | TokenScript$ bg_1_1_insect_flying | TokenOwner$ You | SpellDescription$ Create a number of 1/1 black and green Insect creature tokens with flying equal to the number of card types among cards in your graveyard. +SVar:X:Count$ValidGraveyard Card.YouOwn$CardTypes +DeckHas:Ability$Surveil|Graveyard +Oracle:Reach\nWhen Broodspinner enters, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.)\n{4}{B}{G}, {T}, Sacrifice Broodspinner: Create a number of 1/1 black and green Insect creature tokens with flying equal to the number of card types among cards in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/enter_the_enigma.txt b/forge-gui/res/cardsfolder/upcoming/enter_the_enigma.txt new file mode 100644 index 00000000000..d0c48c63235 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/enter_the_enigma.txt @@ -0,0 +1,7 @@ +Name:Enter the Enigma +ManaCost:U +Types:Instant +A:SP$ Effect | ValidTgts$ Creature | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | StaticAbilities$ Unblockable | AILogic$ Pump | StackDescription$ {c:Targeted} can't be blocked this turn. | SubAbility$ DBDraw | SpellDescription$ Target creature can't be blocked this turn. Draw a card. +SVar:Unblockable:Mode$ CantBlockBy | ValidAttacker$ Card.IsRemembered | Description$ This creature can't be blocked this turn. +SVar:TrigDraw:DB$ Draw +Oracle:Target creature can't be blocked this turn.\nDraw a card. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/frantic_strength.txt b/forge-gui/res/cardsfolder/upcoming/frantic_strength.txt new file mode 100644 index 00000000000..f33fb5f2a14 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/frantic_strength.txt @@ -0,0 +1,8 @@ +Name:Frantic Strength +ManaCost:2 G +Types:Enchantment Aura +K:Flash +K:Enchant creature +A:SP$ Attach | Cost$ 2 G | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Trample | Description$ Enchanted creature gets +2/+2 and has trample. +Oracle:Flash\nEnchant creature\nEnchanted creature gets +2/+2 and has trample. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/jump_scare.txt b/forge-gui/res/cardsfolder/upcoming/jump_scare.txt new file mode 100644 index 00000000000..2e3b7607ea3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/jump_scare.txt @@ -0,0 +1,6 @@ +Name:Jump Scare +ManaCost:W +Types:Instant +A:SP$ Pump | ValidTgts$ Creature | KW$ Flying | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAnimate | SpellDescription$ Until end of turn, target creature gets +2/+2, gains flying, and becomes a Horror enchantment creature in addition to its other types. +SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Types$ Enchantment,Creature,Horror +Oracle:Until end of turn, target creature gets +2/+2, gains flying, and becomes a Horror enchantment creature in addition to its other types. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/kona_rescue_beastie.txt b/forge-gui/res/cardsfolder/upcoming/kona_rescue_beastie.txt new file mode 100644 index 00000000000..3a6af7c7609 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/kona_rescue_beastie.txt @@ -0,0 +1,7 @@ +Name:Kona, Rescue Beastie +Types:Legendary Creature Beast Survivor +ManaCost:3 G +PT:4/3 +T:Mode$ Phase | Phase$ Main2 | ValidPlayer$ You | PresentDefined$ Self | IsPresent$ Card.tapped | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ Survival — At the beginning of your second main phase, if CARDNAME is tapped, you may put a permanent card from your hand onto the battlefield. +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Permanent.YouOwn +Oracle:Survival — At the beginning of your second main phase, if Kona, Rescue Beastie is tapped, you may put a permanent card from your hand onto the battlefield. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/live_or_die.txt b/forge-gui/res/cardsfolder/upcoming/live_or_die.txt new file mode 100644 index 00000000000..777bcf850b9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/live_or_die.txt @@ -0,0 +1,7 @@ +Name:Live or Die +ManaCost:3 B B +Types:Instant +A:SP$ Charm | Choices$ DBChange,DBDestroy | CharmNum$ 1 +SVar:DBChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to the battlefield. +SVar:DBDestroy:DB$ Destroy | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. +Oracle:Choose one —\n• Return target creature card from your graveyard to the battlefield.\n• Destroy target creature. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/malevolent_chandelier.txt b/forge-gui/res/cardsfolder/upcoming/malevolent_chandelier.txt new file mode 100644 index 00000000000..3c6d3e4ecb2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/malevolent_chandelier.txt @@ -0,0 +1,7 @@ +Name:Malevolent Chandelier +ManaCost:6 +Types:Artifact Creature Construct +PT:4/4 +K:Flying +A:AB$ ChangeZone | Cost$ 2 | ValidTgts$ Card | TgtPrompt$ Select target card | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 | SorcerySpeed$ True | SpellDescription$ Put target card from a graveyard on the bottom of its owner's library. Activate only as a sorcery. +Oracle:Flying\n{2}: Put target card from a graveyard on the bottom of its owner's library. Activate only as a sorcery. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/manifest_dread.txt b/forge-gui/res/cardsfolder/upcoming/manifest_dread.txt new file mode 100644 index 00000000000..a5f638f5e94 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/manifest_dread.txt @@ -0,0 +1,5 @@ +Name:Manifest Dread +ManaCost:1 G +Types:Sorcery +A:SP$ ManifestDread | SpellDescription$ Manifest dread. (Look at the top two cards of your library, then put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) +Oracle:Manifest dread. (Look at the top two cards of your library, then put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) diff --git a/forge-gui/res/cardsfolder/upcoming/rootwise_survivor.txt b/forge-gui/res/cardsfolder/upcoming/rootwise_survivor.txt index 3d70c8f1d7b..d8ce8f895ab 100644 --- a/forge-gui/res/cardsfolder/upcoming/rootwise_survivor.txt +++ b/forge-gui/res/cardsfolder/upcoming/rootwise_survivor.txt @@ -7,4 +7,4 @@ T:Mode$ Phase | Phase$ Main2 | ValidPlayer$ You | PresentDefined$ Self | IsPrese SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | TargetMin$ 0 | TargetMax$ 1 | CounterType$ P1P1 | CounterNum$ 3 | SubAbility$ DBAnimate SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Duration$ Permanent | SubAbility$ DBPump SVar:DBPump:DB$ Pump | Keywords$ Haste | Defined$ Targeted | Duration$ UntilYourNextTurn -Oracle:Survival — At the beginning of your second main phase, if Rootwise Survivor is tapped, put three +1/+1 counters on up to one target land you control. That land becomes a 0/0 Elemental creature in addition to its other types. It gains haste until your next turn. +Oracle:Haste\nSurvival — At the beginning of your second main phase, if Rootwise Survivor is tapped, put three +1/+1 counters on up to one target land you control. That land becomes a 0/0 Elemental creature in addition to its other types. It gains haste until your next turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/spectral_snatcher.txt b/forge-gui/res/cardsfolder/upcoming/spectral_snatcher.txt new file mode 100644 index 00000000000..5f34b72b1a5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spectral_snatcher.txt @@ -0,0 +1,7 @@ +Name:Spectral Snatcher +ManaCost:4 B B +Types:Creature Spirit +PT:6/5 +K:Ward:Discard<1/Card> +K:TypeCycling:Swamp:2 +Oracle:Ward—Discard a card. (Whenever this creature becomes the target of a spell or ability an opponent controls, counter it unless that player discards a card.)\nSwampcycling {2} ({2}, Discard this card: Search your library for a Swamp card, reveal it, put it into your hand, then shuffle.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/sporogenic_infection.txt b/forge-gui/res/cardsfolder/upcoming/sporogenic_infection.txt new file mode 100644 index 00000000000..4cae7a13b7d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sporogenic_infection.txt @@ -0,0 +1,13 @@ +Name:Sporogenic Infection +ManaCost:1 B +Types:Enchantment Aura +K:Enchant creature +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSacrifice | TriggerDescription$ When CARDNAME enters, target player sacrifices a creature other than enchanted creature. +SVar:TrigSacrifice:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Creature.!EnchantedBy | SacMessage$ creature other than enchanted creature +A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | AILogic$ Curse +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddSVar$ MortalDestroy +SVar:MortalDestroy:SVar:DestroyWhenDamaged:True +T:Mode$ DamageDoneOnce | ValidTarget$ Creature.EnchantedBy | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ When enchanted creature is dealt damage, destroy it. +SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredTargetLKICopy +SVar:NonStackingAttachEffect:True +Oracle:Enchant creature\nWhen Sporogenic Infection enters, target player sacrifices a creature other than enchanted creature.\nWhen enchanted creature is dealt damage, destroy it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/valgavoths_onslaught.txt b/forge-gui/res/cardsfolder/upcoming/valgavoths_onslaught.txt index 5a0bfa33281..b40db49938f 100644 --- a/forge-gui/res/cardsfolder/upcoming/valgavoths_onslaught.txt +++ b/forge-gui/res/cardsfolder/upcoming/valgavoths_onslaught.txt @@ -1,8 +1,8 @@ Name:Valgavoth's Onslaught ManaCost:X X G Types:Instant -A:SP$ ManifestDread | Amount$ X | RememberManifested$ True | SubAbility$ DBPutCounterAll -SVar:DBPutCounterAll:DB$ PutCounterAll | ValidCards$ Card.IsRemembered | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup +A:SP$ ManifestDread | Amount$ X | RememberManifested$ True | SubAbility$ DBPutCounter +SVar:DBPutCounter:DB$ PutCounter | Defined$ RememberedCard | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid -Oracle:Manifest Dread X times, then put X +1/+1 counters on each of those creatures. (To manifest dread, look at the top two cards of your library, then put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) \ No newline at end of file +Oracle:Manifest dread X times, then put X +1/+1 counters on each of those creatures. (To manifest dread, look at the top two cards of your library, then put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) From b396e780cf6d0cab4d732768fde6e636487c1ed8 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Wed, 18 Sep 2024 09:08:58 +0200 Subject: [PATCH 19/37] Fix scripts (#6169) --- .../main/java/forge/ai/ability/DamageDealAi.java | 6 ------ .../main/java/forge/ai/ability/RepeatEachAi.java | 14 -------------- forge-gui/res/cardsfolder/c/crackling_doom.txt | 3 ++- forge-gui/res/cardsfolder/d/divine_reckoning.txt | 8 ++++---- forge-gui/res/cardsfolder/r/rags_riches.txt | 7 +++---- forge-gui/res/cardsfolder/r/regnas_sanction.txt | 4 ++-- .../upcoming/marvin_murderous_mimic.txt | 4 ++-- .../cardsfolder/upcoming/osseous_sticktwister.txt | 2 +- 8 files changed, 14 insertions(+), 34 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index 7353a927c82..e452056b8f1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -150,12 +150,6 @@ public class DamageDealAi extends DamageAiBase { String logic = sa.getParamOrDefault("AILogic", ""); if ("DiscardLands".equals(logic)) { dmg = 2; - } else if ("OpponentHasCreatures".equals(logic)) { - for (Player opp : ai.getOpponents()) { - if (!opp.getCreaturesInPlay().isEmpty()) { - return true; - } - } } else if (logic.startsWith("ProcRaid.")) { if (ai.getGame().getPhaseHandler().isPlayerTurn(ai) && ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) { for (Card potentialAtkr : ai.getCreaturesInPlay()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java b/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java index e7ed3a5dfa7..175372ddf75 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java @@ -45,20 +45,6 @@ public class RepeatEachAi extends SpellAbilityAi { return false; } } - } else if ("OpponentHasCreatures".equals(logic)) { //TODO convert this to NeedsToPlayVar - for (Player opp : aiPlayer.getOpponents()) { - if (!opp.getCreaturesInPlay().isEmpty()) { - return true; - } - } - return false; - } else if ("OpponentHasMultipleCreatures".equals(logic)) { - for (Player opp : aiPlayer.getOpponents()) { - if (opp.getCreaturesInPlay().size() > 1) { - return true; - } - } - return false; } else if ("AllPlayerLoseLife".equals(logic)) { final Card source = sa.getHostCard(); SpellAbility repeat = sa.getAdditionalAbility("RepeatSubAbility"); diff --git a/forge-gui/res/cardsfolder/c/crackling_doom.txt b/forge-gui/res/cardsfolder/c/crackling_doom.txt index 09abdb31386..245ec142783 100644 --- a/forge-gui/res/cardsfolder/c/crackling_doom.txt +++ b/forge-gui/res/cardsfolder/c/crackling_doom.txt @@ -1,9 +1,10 @@ Name:Crackling Doom ManaCost:R W B Types:Instant -A:SP$ DealDamage | Defined$ Player.Opponent | NumDmg$ 2 | SubAbility$ DBRepeat | AILogic$ OpponentHasCreatures | SpellDescription$ CARDNAME deals 2 damage to each opponent. Each opponent sacrifices a creature with the greatest power among creatures that player controls. +A:SP$ DealDamage | Defined$ Player.Opponent | NumDmg$ 2 | SubAbility$ DBRepeat | SpellDescription$ CARDNAME deals 2 damage to each opponent. Each opponent sacrifices a creature with the greatest power among creatures that player controls. SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSac SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | RememberChosen$ True SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup | StackDescription$ Each opponent sacrifices a creature with the greatest power among creatures they control. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:NeedsToPlay:Creature.OppCtrl Oracle:Crackling Doom deals 2 damage to each opponent. Each opponent sacrifices a creature with the greatest power among creatures that player controls. diff --git a/forge-gui/res/cardsfolder/d/divine_reckoning.txt b/forge-gui/res/cardsfolder/d/divine_reckoning.txt index 2f0c276ea12..d4370d138f0 100644 --- a/forge-gui/res/cardsfolder/d/divine_reckoning.txt +++ b/forge-gui/res/cardsfolder/d/divine_reckoning.txt @@ -2,9 +2,9 @@ Name:Divine Reckoning ManaCost:2 W W Types:Sorcery K:Flashback:5 W W -A:SP$ RepeatEach | AILogic$ OpponentHasMultipleCreatures | RepeatPlayers$ Player | RepeatSubAbility$ DBChoose | SubAbility$ DBDestroyAll | SpellDescription$ Each player chooses a creature they control. Destroy the rest. -SVar:DBChoose:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True -SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Creature.IsNotRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:SP$ ChooseCard | Defined$ Player | Amount$ 1 | Choices$ Creature | ControlledByPlayer$ Chooser | Mandatory$ True | SubAbility$ DBDestroyAll | SpellDescription$ Each player chooses a creature they control. Destroy the rest. +SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Creature.!ChosenCard AI:RemoveDeck:All +SVar:NeedsToPlayVar:Z GE2 +SVar:Z:Count$Valid Creature.OppCtrl Oracle:Each player chooses a creature they control. Destroy the rest.\nFlashback {5}{W}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/r/rags_riches.txt b/forge-gui/res/cardsfolder/r/rags_riches.txt index 52641ba633d..26d9674cab5 100644 --- a/forge-gui/res/cardsfolder/r/rags_riches.txt +++ b/forge-gui/res/cardsfolder/r/rags_riches.txt @@ -11,8 +11,7 @@ Name:Riches ManaCost:5 U U Types:Sorcery K:Aftermath -A:SP$ RepeatEach | AILogic$ OpponentHasCreatures | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ ChooseCreature | SubAbility$ StealChosen | SpellDescription$ Each opponent chooses a creature they control. You gain control of those creatures. -SVar:ChooseCreature:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.RememberedPlayerCtrl | ChoiceTitle$ Choose a creature to be stolen | AILogic$ WorstCard | RememberChosen$ True | Mandatory$ True -SVar:StealChosen:DB$ GainControl | AllValid$ Permanent.IsRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:SP$ ChooseCard | Defined$ Opponent | Mandatory$ True | Amount$ 1 | Choices$ Creature | ControlledByPlayer$ Chooser | ChoiceTitle$ Choose a creature to be stolen | AILogic$ WorstCard | Mandatory$ True | SubAbility$ StealChosen | SpellDescription$ Each opponent chooses a creature they control. You gain control of those creatures. +SVar:StealChosen:DB$ GainControl | AllValid$ Permanent.ChosenCard +SVar:NeedsToPlay:Creature.OppCtrl Oracle:Aftermath (Cast this spell only from your graveyard. Then exile it.)\nEach opponent chooses a creature they control. You gain control of those creatures. diff --git a/forge-gui/res/cardsfolder/r/regnas_sanction.txt b/forge-gui/res/cardsfolder/r/regnas_sanction.txt index ae820a92ae5..932592dc583 100644 --- a/forge-gui/res/cardsfolder/r/regnas_sanction.txt +++ b/forge-gui/res/cardsfolder/r/regnas_sanction.txt @@ -13,6 +13,6 @@ SVar:DBTapAll:DB$ TapAll | ValidCards$ Creature.IsImprinted | TapperController$ SVar:DBCleanupAll:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True | ClearChosenCard$ True SVar:NeedsToPlayVar:Z GE3 SVar:Z:SVar$Z1/Plus.Z2 -SVar:Z1:Count$Valid Creature.YourTeamCtrl+inZoneBattlefield -SVar:Z2:Count$Valid Creature.OppCtrl+inZoneBattlefield+untapped +SVar:Z1:Count$Valid Creature.YourTeamCtrl +SVar:Z2:Count$Valid Creature.OppCtrl+untapped Oracle:For each player, choose friend or foe. Each friend puts a +1/+1 counter on each creature they control. Each foe chooses one untapped creature they control, then taps the rest. diff --git a/forge-gui/res/cardsfolder/upcoming/marvin_murderous_mimic.txt b/forge-gui/res/cardsfolder/upcoming/marvin_murderous_mimic.txt index 370ce81eef3..15a981a828a 100644 --- a/forge-gui/res/cardsfolder/upcoming/marvin_murderous_mimic.txt +++ b/forge-gui/res/cardsfolder/upcoming/marvin_murderous_mimic.txt @@ -1,6 +1,6 @@ Name:Marvin, Murderous Mimic ManaCost:2 Types:Legendary Artifact Creature Toy -PT:4/6 +PT:2/2 S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Creature.YouCtrl+!sharesNameWith Self | Description$ CARDNAME has all activated abilities of creatures you control that don't have the same name as this creature. -Oracle:Marvin, Murderous Mimic has all activated abilities of creatures you control that don't have the same name as this creature. \ No newline at end of file +Oracle:Marvin, Murderous Mimic has all activated abilities of creatures you control that don't have the same name as this creature. diff --git a/forge-gui/res/cardsfolder/upcoming/osseous_sticktwister.txt b/forge-gui/res/cardsfolder/upcoming/osseous_sticktwister.txt index d1926af3130..6edf107faec 100644 --- a/forge-gui/res/cardsfolder/upcoming/osseous_sticktwister.txt +++ b/forge-gui/res/cardsfolder/upcoming/osseous_sticktwister.txt @@ -3,7 +3,7 @@ ManaCost:1 B Types:Artifact Creature Scarecrow PT:2/2 K:Lifelink -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Condition$ Delirium | TriggerZones$ Battlefield | Execute$ TrigMaySacorDiscard | TriggerDescription$ Delirium — At the beginning of your end step, if there are four or more card types among cards in your graveyard, each opponent may sacrifice a nonland permanent or discard a card. Then CARDNAME deals damage equal to its power to each opponent who didn't sacrifice a permanent or discard a card this way. +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Delirium$ True | TriggerZones$ Battlefield | Execute$ TrigMaySacorDiscard | TriggerDescription$ Delirium — At the beginning of your end step, if there are four or more card types among cards in your graveyard, each opponent may sacrifice a nonland permanent or discard a card. Then CARDNAME deals damage equal to its power to each opponent who didn't sacrifice a permanent or discard a card this way. SVar:TrigMaySacorDiscard:DB$ GenericChoice | Choices$ PaySac,PayDiscard | TempRemember$ Chooser | Defined$ Opponent | AILogic$ PayUnlessCost | DamageMap$ True SVar:PaySac:DB$ DealDamage | NumDmg$ X | Defined$ Remembered | UnlessCost$ Sac<1/Permanent.nonLand> | UnlessPayer$ Remembered | UnlessAI$ LifeLTX | SpellDescription$ CARDNAME deals damage equal to its power to you unless you sacrifice a nonland permanent. SVar:PayDiscard:DB$ DealDamage | NumDmg$ X | Defined$ Remembered | UnlessCost$ Discard<1/Card> | UnlessPayer$ Remembered | UnlessAI$ LifeLTX | SpellDescription$ CARDNAME deals damage equal to its power to you unless you discard a card. From daf1a891c0edf7419317234906e8fd9901e4c8d7 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Wed, 18 Sep 2024 07:11:28 +0000 Subject: [PATCH 20/37] Update zndrsplts_judgment.txt --- forge-gui/res/cardsfolder/z/zndrsplts_judgment.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/z/zndrsplts_judgment.txt b/forge-gui/res/cardsfolder/z/zndrsplts_judgment.txt index fbbc7200b5a..ce04235baca 100644 --- a/forge-gui/res/cardsfolder/z/zndrsplts_judgment.txt +++ b/forge-gui/res/cardsfolder/z/zndrsplts_judgment.txt @@ -10,6 +10,6 @@ SVar:BounceAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Hand | Cha SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True SVar:NeedsToPlayVar:Z GE2 SVar:Z:SVar$Z1/Plus.Z2 -SVar:Z1:Count$Valid Creature.YourTeamCtrl+inZoneBattlefield -SVar:Z2:Count$Valid Creature.OppCtrl+inZoneBattlefield +SVar:Z1:Count$Valid Creature.YourTeamCtrl +SVar:Z2:Count$Valid Creature.OppCtrl Oracle:For each player, choose friend or foe. Each friend creates a token that's a copy of a creature they control. Each foe returns a creature they control to its owner's hand. From ee3c8173e1f2fe8898238d1efb4ce31e5f129fd1 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Wed, 18 Sep 2024 09:37:11 +0200 Subject: [PATCH 21/37] Fix RE choice for different sources --- forge-gui/src/main/java/forge/player/PlayerControllerHuman.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index aa90be9c9c6..8aa9384c670 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1859,7 +1859,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont if (possibleReplacers.size() == 1) { return first; } - final List res = possibleReplacers.stream().map(ReplacementEffect::getDescription).collect(Collectors.toList()); + final List res = possibleReplacers.stream().map(ReplacementEffect::toString).collect(Collectors.toList()); final String firstStr = res.get(0); final String prompt = localizer.getMessage("lblChooseFirstApplyReplacementEffect"); for (int i = 1; i < res.size(); i++) { From ac807c4766b838384c701677cf54424e2de37f05 Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Thu, 19 Sep 2024 04:56:29 +0100 Subject: [PATCH 22/37] Fixes gleaned from notes: pass #2, Cataclysm-like and other "choose to keep" effects. (#6165) * Add files via upload * Update slaughter_the_strong.txt * Update incriminate.txt * Update a-incriminate.txt * Update phyrexian_dreadnought.txt * Update killing_wave.txt * Update global_ruin.txt * Update barrins_spite.txt * Update szats_will.txt * Update soul_shatter.txt * Update slaughter_the_strong.txt * Update shadowgrange_archfiend.txt * Update professor_onyx.txt * Update phyrexian_dreadnought.txt * Update myrkuls_edict.txt * Update gixs_command.txt * Update flare_of_malice.txt * Update demonic_hordes.txt * Update crackling_doom.txt * Update revival_experiment.txt * Update perilous_predicament.txt * Update regnas_sanction.txt * Update catch_release.txt * Update regnas_sanction.txt * Update regnas_sanction.txt --------- Co-authored-by: tool4ever --- .../a/ajani_nacatl_pariah_ajani_nacatl_avenger.txt | 12 ++++-------- .../res/cardsfolder/a/archfiend_of_depravity.txt | 5 +++-- forge-gui/res/cardsfolder/b/barrins_spite.txt | 1 + forge-gui/res/cardsfolder/c/catch_release.txt | 4 ++-- forge-gui/res/cardsfolder/c/covetous_elegy.txt | 8 +++----- forge-gui/res/cardsfolder/c/crackling_doom.txt | 2 +- forge-gui/res/cardsfolder/d/demonic_hordes.txt | 2 +- forge-gui/res/cardsfolder/f/flare_of_malice.txt | 2 +- forge-gui/res/cardsfolder/g/gixs_command.txt | 2 +- forge-gui/res/cardsfolder/g/global_ruin.txt | 3 ++- forge-gui/res/cardsfolder/i/incriminate.txt | 1 + forge-gui/res/cardsfolder/k/keldon_firebombers.txt | 8 ++++---- forge-gui/res/cardsfolder/k/killing_wave.txt | 1 + .../res/cardsfolder/l/liliana_dreadhorde_general.txt | 8 +++----- forge-gui/res/cardsfolder/l/limited_resources.txt | 10 +++++----- forge-gui/res/cardsfolder/m/myrkuls_edict.txt | 2 +- .../cardsfolder/n/no_one_will_hear_your_cries.txt | 3 +-- forge-gui/res/cardsfolder/p/perilous_predicament.txt | 7 ++----- .../res/cardsfolder/p/phyrexian_dreadnought.txt | 3 ++- forge-gui/res/cardsfolder/p/professor_onyx.txt | 2 +- forge-gui/res/cardsfolder/r/razias_purification.txt | 7 +++---- forge-gui/res/cardsfolder/r/regnas_sanction.txt | 12 +++--------- forge-gui/res/cardsfolder/r/revival_experiment.txt | 9 ++++----- .../res/cardsfolder/rebalanced/a-incriminate.txt | 1 + .../res/cardsfolder/s/shadowgrange_archfiend.txt | 2 +- forge-gui/res/cardsfolder/s/single_combat.txt | 9 ++++----- forge-gui/res/cardsfolder/s/slaughter_the_strong.txt | 3 ++- forge-gui/res/cardsfolder/s/soul_shatter.txt | 2 +- forge-gui/res/cardsfolder/s/stick_together.txt | 2 +- forge-gui/res/cardsfolder/s/szats_will.txt | 2 +- forge-gui/res/cardsfolder/t/the_eternal_wanderer.txt | 2 +- forge-gui/res/cardsfolder/t/tragic_arrogance.txt | 10 ++++------ 32 files changed, 66 insertions(+), 81 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/ajani_nacatl_pariah_ajani_nacatl_avenger.txt b/forge-gui/res/cardsfolder/a/ajani_nacatl_pariah_ajani_nacatl_avenger.txt index fc71107e14d..aa92355bb34 100644 --- a/forge-gui/res/cardsfolder/a/ajani_nacatl_pariah_ajani_nacatl_avenger.txt +++ b/forge-gui/res/cardsfolder/a/ajani_nacatl_pariah_ajani_nacatl_avenger.txt @@ -8,7 +8,7 @@ T:Mode$ ChangesZoneAll | TriggerZones$ Battlefield | ValidCards$ Cat.Other+YouCt SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | Transformed$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -DeckHas:Ability$Token +DeckHas:Ability$Sacrifice|Token AlternateMode:DoubleFaced Oracle:When Ajani, Nacatl Pariah enters, create a 2/1 white Cat Warrior creature token.\nWhenever one or more other Cats you control die, you may exile Ajani, then return him to the battlefield transformed under his owner's control. @@ -24,11 +24,7 @@ A:AB$ Token | Cost$ AddCounter<0/LOYALTY> | TokenAmount$ 1 | TokenScript$ w_2_1_ SVar:DBImmediateTrig1:DB$ ImmediateTrigger | TriggerAmount$ Remembered$Amount | ConditionPresent$ Permanent.Red+YouCtrl+Other | Execute$ TrigDamage | TriggerDescription$ When you do, if you control a red permanent other than CARDNAME, he deals damage equal to the number of creatures you control to any target. SVar:TrigDamage:DB$ DealDamage | NumDmg$ X | ValidTgts$ Any | ConditionPresent$ Permanent.Red+YouCtrl+Other | SubAbility$ DBCleanup | TgtPrompt$ Select any valid target | SpellDescription$ CARDNAME deals damage equal to the number of creatures you control to any target. SVar:X:Count$Valid Creature.YouCtrl -A:AB$ RepeatEach | Cost$ SubCounter<4/LOYALTY> | Planeswalker$ True | Ultimate$ True | RepeatPlayers$ Opponent | RepeatSubAbility$ ChooseArtf | SubAbility$ SacAllOthers | SpellDescription$ Each opponent chooses an artifact, a creature, an enchantment, and a planeswalker from among the nonland permanents they control, then sacrifices the rest. -SVar:ChooseArtf:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Artifact.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose an artifact to keep | SubAbility$ ChooseCrtr | RememberChosen$ True | Mandatory$ True -SVar:ChooseCrtr:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose a creature to keep | SubAbility$ ChooseEnch | RememberChosen$ True | Mandatory$ True -SVar:ChooseEnch:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Enchantment.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose an enchantment to keep | SubAbility$ ChoosePwkr | RememberChosen$ True | Mandatory$ True -SVar:ChoosePwkr:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Planeswalker.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose a land to keep | RememberChosen$ True | Mandatory$ True -SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.nonLand+OppCtrl+IsNotRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:AB$ ChooseCard | Cost$ SubCounter<4/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ Opponent | Choices$ Permanent.nonLand | ChooseEach$ Artifact & Creature & Enchantment & Planeswalker | ControlledByPlayer$ Chooser | Mandatory$ True | Reveal$ True | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ Each opponent chooses an artifact, a creature, an enchantment, and a planeswalker from among the nonland permanents they control, then sacrifices the rest. +SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.nonLand+OppCtrl+nonChosenCard | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True Oracle:[+2]: Put a +1/+1 counter on each Cat you control.\n[0]: Create a 2/1 white Cat Warrior creature token. When you do, if you control a red permanent other than Ajani, Nacatl Avenger, he deals damage equal to the number of creatures you control to any target.\n[-4]: Each opponent chooses an artifact, a creature, an enchantment and a planeswalker from among the nonland permanents they control, then sacrifices the rest. diff --git a/forge-gui/res/cardsfolder/a/archfiend_of_depravity.txt b/forge-gui/res/cardsfolder/a/archfiend_of_depravity.txt index 665255b7ee5..fde7c69e384 100644 --- a/forge-gui/res/cardsfolder/a/archfiend_of_depravity.txt +++ b/forge-gui/res/cardsfolder/a/archfiend_of_depravity.txt @@ -3,8 +3,9 @@ ManaCost:3 B B Types:Creature Demon PT:5/4 K:Flying -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of each opponent's end step, that player chooses up to two creature they control, then sacrifices the rest. -SVar:TrigChoose:DB$ ChooseCard | Defined$ TriggeredPlayer | MinAmount$ 0 | Amount$ 2 | TargetControls$ True | Choices$ Creature | ChoiceTitle$ Choose up to two creatures | SubAbility$ DBSacrificeAll +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of each opponent's end step, that player chooses up to two creatures they control, then sacrifices the rest. +SVar:TrigChoose:DB$ ChooseCard | Defined$ TriggeredPlayer | MinAmount$ 0 | Amount$ 2 | TargetControls$ True | Choices$ Creature | ChoiceTitle$ Choose up to two creatures to keep | Reveal$ True | SubAbility$ DBSacrificeAll SVar:DBSacrificeAll:DB$ SacrificeAll | ValidCards$ Creature.nonChosenCard | Controller$ TriggeredPlayer | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True +DeckHas:Ability$Sacrifice Oracle:Flying\nAt the beginning of each opponent's end step, that player chooses up to two creatures they control, then sacrifices the rest. diff --git a/forge-gui/res/cardsfolder/b/barrins_spite.txt b/forge-gui/res/cardsfolder/b/barrins_spite.txt index d63bbe917f7..72caa90ac5c 100644 --- a/forge-gui/res/cardsfolder/b/barrins_spite.txt +++ b/forge-gui/res/cardsfolder/b/barrins_spite.txt @@ -6,4 +6,5 @@ SVar:DBChooseSac:DB$ ChooseCard | Choices$ Card.IsRemembered | Defined$ Targeted SVar:DBSac:DB$ SacrificeAll | Defined$ ChosenCard | SubAbility$ DBBounce | StackDescription$ None SVar:DBBounce:DB$ ChangeZone | Defined$ Remembered | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBCleanup | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Sacrifice Oracle:Choose two target creatures controlled by the same player. Their controller chooses and sacrifices one of them. Return the other to its owner's hand. diff --git a/forge-gui/res/cardsfolder/c/catch_release.txt b/forge-gui/res/cardsfolder/c/catch_release.txt index fc0922875fa..2bb13219280 100644 --- a/forge-gui/res/cardsfolder/c/catch_release.txt +++ b/forge-gui/res/cardsfolder/c/catch_release.txt @@ -11,6 +11,6 @@ ALTERNATE Name:Release ManaCost:4 R W Types:Sorcery -A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBSac | SpellDescription$ Each player sacrifices an artifact, a creature, an enchantment, a land, and a planeswalker. -SVar:DBSac:DB$ Sacrifice | Defined$ Player.IsRemembered | SacValid$ Artifact & Creature & Enchantment & Land & Planeswalker | SacEachValid$ True +A:SP$ Sacrifice | Defined$ Player | SacValid$ Artifact & Creature & Enchantment & Land & Planeswalker | SacEachValid$ True | SpellDescription$ Each player sacrifices an artifact, a creature, an enchantment, a land, and a planeswalker. +DeckHas:Ability$Sacrifice Oracle:Each player sacrifices an artifact, a creature, an enchantment, a land, and a planeswalker.\nFuse (You may cast one or both halves of this card from your hand.) diff --git a/forge-gui/res/cardsfolder/c/covetous_elegy.txt b/forge-gui/res/cardsfolder/c/covetous_elegy.txt index 41a4ab1a5b0..1ec2f2c1004 100644 --- a/forge-gui/res/cardsfolder/c/covetous_elegy.txt +++ b/forge-gui/res/cardsfolder/c/covetous_elegy.txt @@ -1,11 +1,9 @@ Name:Covetous Elegy ManaCost:4 W B Types:Sorcery -A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChooseSac | SubAbility$ DBSac | SpellDescription$ Each player chooses up to two creatures they control, then sacrifices the rest. Then you create a tapped Treasure token for each creature your opponents control. -SVar:DBChooseSac:DB$ ChooseCard | Defined$ Remembered | Choices$ Creature.RememberedPlayerCtrl | Amount$ 2 | ChoiceTitle$ Choose two creatures not to be sacrificed | RememberChosen$ True -SVar:DBSac:DB$ SacrificeAll | ValidCards$ Creature.IsNotRemembered | SubAbility$ DBToken -SVar:DBToken:DB$ Token | TokenScript$ c_a_treasure_sac | TokenAmount$ X | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:SP$ ChooseCard | Defined$ Player | Choices$ Creature | ControlledByPlayer$ Chooser | MinAmount$ 0 | Amount$ 2 | ChoiceTitle$ Choose up to two creatures to keep | Reveal$ True | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ Each player chooses up to two creatures they control, then sacrifices the rest. Then you create a tapped Treasure token for each creature your opponents control. +SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Creature.nonChosenCard | SubAbility$ DBToken +SVar:DBToken:DB$ Token | TokenScript$ c_a_treasure_sac | TokenAmount$ X SVar:X:Count$Valid Creature.OppCtrl AI:RemoveDeck:All DeckHas:Ability$Token|Sacrifice & Type$Treasure diff --git a/forge-gui/res/cardsfolder/c/crackling_doom.txt b/forge-gui/res/cardsfolder/c/crackling_doom.txt index 245ec142783..7f707124363 100644 --- a/forge-gui/res/cardsfolder/c/crackling_doom.txt +++ b/forge-gui/res/cardsfolder/c/crackling_doom.txt @@ -3,7 +3,7 @@ ManaCost:R W B Types:Instant A:SP$ DealDamage | Defined$ Player.Opponent | NumDmg$ 2 | SubAbility$ DBRepeat | SpellDescription$ CARDNAME deals 2 damage to each opponent. Each opponent sacrifices a creature with the greatest power among creatures that player controls. SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSac -SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | RememberChosen$ True +SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | Reveal$ True | RememberChosen$ True SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup | StackDescription$ Each opponent sacrifices a creature with the greatest power among creatures they control. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NeedsToPlay:Creature.OppCtrl diff --git a/forge-gui/res/cardsfolder/d/demonic_hordes.txt b/forge-gui/res/cardsfolder/d/demonic_hordes.txt index b114dbf4c0f..ebdf7b754f4 100644 --- a/forge-gui/res/cardsfolder/d/demonic_hordes.txt +++ b/forge-gui/res/cardsfolder/d/demonic_hordes.txt @@ -6,7 +6,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E A:AB$ Destroy | ValidTgts$ Land | TgtPrompt$ Select target land. | Cost$ T | SpellDescription$ Destroy target land. SVar:DBTap:DB$ Tap | Defined$ Self | UnlessCost$ B B B | UnlessPayer$ You | UnlessResolveSubs$ WhenNotPaid | SubAbility$ DBChooseOpponent SVar:DBChooseOpponent:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | ChoiceTitle$ Choose an opponent | SubAbility$ DBChooseLand -SVar:DBChooseLand:DB$ ChooseCard | Defined$ ChosenPlayer | Choices$ Land.YouCtrl | Mandatory$ True | ChoiceTitle$ Select a land for opponent to sacrifice | SubAbility$ DBSacLand +SVar:DBChooseLand:DB$ ChooseCard | Defined$ ChosenPlayer | Choices$ Land.YouCtrl | Mandatory$ True | Reveal$ True | ChoiceTitle$ Select a land for opponent to sacrifice | SubAbility$ DBSacLand SVar:DBSacLand:DB$ SacrificeAll | Defined$ ChosenCard SVar:PlayMain1:FALSE DeckHas:Ability$Sacrifice diff --git a/forge-gui/res/cardsfolder/f/flare_of_malice.txt b/forge-gui/res/cardsfolder/f/flare_of_malice.txt index b8f10ae9bb9..cba397a41dd 100644 --- a/forge-gui/res/cardsfolder/f/flare_of_malice.txt +++ b/forge-gui/res/cardsfolder/f/flare_of_malice.txt @@ -3,7 +3,7 @@ ManaCost:2 B B Types:Instant S:Mode$ AlternativeCost | ValidSA$ Spell.Self | EffectZone$ All | Cost$ Sac<1/Creature.Black+nonToken/a nontoken black creature> | Description$ You may sacrifice a nontoken black creature rather than pay this spell's mana cost. A:SP$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSacAll | SpellDescription$ Each opponent sacrifices a creature or planeswalker with the greatest mana value among creatures and planeswalkers they control. -SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl+cmcEQX,Planeswalker.RememberedPlayerCtrl+cmcEQX | ChoiceTitle$ Choose a creature or planeswalker with the greatest mana value among creatures and planeswalkers you control | Mandatory$ True | RememberChosen$ True +SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl+cmcEQX,Planeswalker.RememberedPlayerCtrl+cmcEQX | ChoiceTitle$ Choose a creature or planeswalker with the greatest mana value among creatures and planeswalkers you control | Mandatory$ True | Reveal$ True | RememberChosen$ True SVar:X:Count$Valid Creature.RememberedPlayerCtrl,Planeswalker.RememberedPlayerCtrl$GreatestCMC SVar:DBSacAll:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup SVar:DBCleanupChosen:DB$ Cleanup | ClearChosenPlayer$ True diff --git a/forge-gui/res/cardsfolder/g/gixs_command.txt b/forge-gui/res/cardsfolder/g/gixs_command.txt index d091f6ccec8..00e1230b1c3 100644 --- a/forge-gui/res/cardsfolder/g/gixs_command.txt +++ b/forge-gui/res/cardsfolder/g/gixs_command.txt @@ -8,7 +8,7 @@ SVar:DBPump:DB$ Pump | Defined$ ChosenCard | KW$ Lifelink SVar:DBMurder:DB$ DestroyAll | ValidCards$ Creature.powerLE2 | SpellDescription$ Destroy each creature with power 2 or less. SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ChangeNum$ 2 | ChangeType$ Creature.YouOwn | SelectPrompt$ Select up to two creature cards from your graveyard to return to your hand | Hidden$ True | StackDescription$ {p:You} returns up to two creature cards from their graveyard to their hand. | SpellDescription$ Return up to two creature cards from your graveyard to your hand. SVar:DBSacrifice:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSac | SpellDescription$ Each opponent sacrifices a creature with the highest power among creatures they control. -SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | RememberChosen$ True +SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | Reveal$ True | RememberChosen$ True SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup | StackDescription$ Each opponent sacrifices a creature with the greatest power among creatures they control. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True DeckHas:Ability$Sacrifice|LifeGain|Counters & Keyword$Lifelink diff --git a/forge-gui/res/cardsfolder/g/global_ruin.txt b/forge-gui/res/cardsfolder/g/global_ruin.txt index e2c17438518..43c26274289 100644 --- a/forge-gui/res/cardsfolder/g/global_ruin.txt +++ b/forge-gui/res/cardsfolder/g/global_ruin.txt @@ -1,7 +1,8 @@ Name:Global Ruin ManaCost:4 W Types:Sorcery -A:SP$ ChooseCard | Defined$ Player | EachBasicType$ Controlled | SubAbility$ DBDestroy | SpellDescription$ Each player chooses from the lands they control a land of each basic land type, then sacrifices the rest. | StackDescription$ SpellDescription +A:SP$ ChooseCard | Defined$ Player | EachBasicType$ Controlled | Reveal$ True | SubAbility$ DBDestroy | SpellDescription$ Each player chooses from the lands they control a land of each basic land type, then sacrifices the rest. | StackDescription$ SpellDescription SVar:DBDestroy:DB$ SacrificeAll | ValidCards$ Land.nonChosenCard | StackDescription$ None AI:RemoveDeck:Random +DeckHas:Ability$Sacrifice Oracle:Each player chooses from the lands they control a land of each basic land type, then sacrifices the rest. diff --git a/forge-gui/res/cardsfolder/i/incriminate.txt b/forge-gui/res/cardsfolder/i/incriminate.txt index b5f89eb3ae9..40823ae765f 100644 --- a/forge-gui/res/cardsfolder/i/incriminate.txt +++ b/forge-gui/res/cardsfolder/i/incriminate.txt @@ -4,4 +4,5 @@ Types:Sorcery A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Choose two target creatures controlled by the same player | TargetMin$ 2 | TargetMax$ 2 | TargetUnique$ True | TargetsWithSameController$ True | IsCurse$ True | SubAbility$ DBChooseSac | StackDescription$ SpellDescription | SpellDescription$ Choose two target creatures controlled by the same player. That player sacrifices one of them. SVar:DBChooseSac:DB$ ChooseCard | DefinedCards$ Targeted | Defined$ TargetedController | ChoiceTitle$ Choose one to sacrifice | SubAbility$ DBSac | StackDescription$ None | AILogic$ WorstCard SVar:DBSac:DB$ SacrificeAll | Defined$ ChosenCard | StackDescription$ None +DeckHas:Ability$Sacrifice Oracle:Choose two target creatures controlled by the same player. That player sacrifices one of them. diff --git a/forge-gui/res/cardsfolder/k/keldon_firebombers.txt b/forge-gui/res/cardsfolder/k/keldon_firebombers.txt index 36201021ac4..f390aa28f7a 100644 --- a/forge-gui/res/cardsfolder/k/keldon_firebombers.txt +++ b/forge-gui/res/cardsfolder/k/keldon_firebombers.txt @@ -3,8 +3,8 @@ ManaCost:3 R R Types:Creature Human Soldier PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChooseThree | TriggerDescription$ When CARDNAME enters, each player sacrifices all lands they control except for three. -SVar:TrigChooseThree:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChoose | SubAbility$ DBSacrificeAll -SVar:DBChoose:DB$ ChooseCard | Amount$ 3 | Defined$ Remembered | Choices$ Land.RememberedPlayerCtrl | ChoiceZone$ Battlefield | RememberChosen$ True | ChoiceTitle$ Choose three lands that would not be sacrificed -SVar:DBSacrificeAll:DB$ SacrificeAll | ValidCards$ Land.IsNotRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TrigChooseThree:DB$ ChooseCard | Defined$ Player | Choices$ Land | ControlledByPlayer$ Chooser | Amount$ 3 | ChoiceTitle$ Choose three lands to keep | Mandatory$ True | Reveal$ True | SubAbility$ SacAllOthers +SVar:DBSacrificeAll:DB$ SacrificeAll | ValidCards$ Land.nonChosenCard | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True +DeckHas:Ability$Sacrifice Oracle:When Keldon Firebombers enters, each player sacrifices all lands they control except for three. diff --git a/forge-gui/res/cardsfolder/k/killing_wave.txt b/forge-gui/res/cardsfolder/k/killing_wave.txt index 9874fb03955..0331b56dcec 100644 --- a/forge-gui/res/cardsfolder/k/killing_wave.txt +++ b/forge-gui/res/cardsfolder/k/killing_wave.txt @@ -11,4 +11,5 @@ SVar:X:Count$xPaid SVar:Y:SVar$X/Times.Z SVar:Z:Count$Valid Creature.RememberedPlayerCtrl+IsRemembered AI:RemoveDeck:All +DeckHas:Ability$Sacrifice Oracle:For each creature, its controller sacrifices it unless they pay X life. diff --git a/forge-gui/res/cardsfolder/l/liliana_dreadhorde_general.txt b/forge-gui/res/cardsfolder/l/liliana_dreadhorde_general.txt index bf296f7d67e..ba827aaa658 100644 --- a/forge-gui/res/cardsfolder/l/liliana_dreadhorde_general.txt +++ b/forge-gui/res/cardsfolder/l/liliana_dreadhorde_general.txt @@ -6,11 +6,9 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ SVar:TrigDraw:DB$ Draw A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TokenScript$ b_2_2_zombie | SpellDescription$ Create a 2/2 black Zombie creature token. A:AB$ Sacrifice | Cost$ SubCounter<4/LOYALTY> | Planeswalker$ True | Amount$ 2 | SacValid$ Creature | Defined$ Player | SpellDescription$ Each player sacrifices two creatures. -A:AB$ RepeatEach | Cost$ SubCounter<9/LOYALTY> | Planeswalker$ True | Ultimate$ True | RepeatPlayers$ Opponent | RepeatSubAbility$ ChoosePerms | SubAbility$ SacAllOthers | SpellDescription$ Each opponent chooses a permanent they control of each permanent type and sacrifices the rest. -SVar:ChoosePerms:DB$ RepeatEach | RepeatTypesFrom$ Permanent.RememberedPlayerCtrl | ChooseOrder$ RememberedPlayer | RepeatSubAbility$ ChooseCard -SVar:ChooseCard:DB$ ChooseCard | Defined$ RememberedPlayer | Choices$ Card.ChosenType+RememberedPlayerCtrl | ChoiceTitle$ Choose a card of this type to keep | ChoiceTitleAppend$ ChosenType | RememberChosen$ True | Mandatory$ True -SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.IsNotRemembered+OppCtrl | SubAbility$ DBCleanup | StackDescription$ None -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True +A:AB$ ChooseCard | Cost$ SubCounter<9/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ Opponent | Choices$ Permanent | ChooseEach$ Artifact & Battle & Creature & Enchantment & Land & Planeswalker | ControlledByPlayer$ Chooser | Mandatory$ True | Reveal$ True | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ Each opponent chooses a permanent they control of each permanent type and sacrifices the rest. +SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.nonChosenCard+OppCtrl | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True DeckHas:Ability$Token|Sacrifice & Type$Zombie SVar:PlayMain1:TRUE Oracle:Whenever a creature you control dies, draw a card.\n[+1]: Create a 2/2 black Zombie creature token.\n[-4]: Each player sacrifices two creatures.\n[-9]: Each opponent chooses a permanent they control of each permanent type and sacrifices the rest. diff --git a/forge-gui/res/cardsfolder/l/limited_resources.txt b/forge-gui/res/cardsfolder/l/limited_resources.txt index 244e5452eaa..8aea385ba81 100644 --- a/forge-gui/res/cardsfolder/l/limited_resources.txt +++ b/forge-gui/res/cardsfolder/l/limited_resources.txt @@ -1,13 +1,13 @@ Name:Limited Resources ManaCost:W Types:Enchantment -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ DBRepeatResources | TriggerDescription$ When CARDNAME enters, each player chooses five lands they control and sacrifices the rest. -SVar:DBRepeatResources:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ CardChoice -SVar:CardChoice:DB$ ChooseCard | Defined$ Remembered | Amount$ 5 | Choices$ Land.RememberedPlayerCtrl | ChoiceTitle$ Choose a land | RememberChosen$ True | SubAbility$ SacRest -SVar:SacRest:DB$ SacrificeAll | ValidCards$ Land.RememberedPlayerCtrl+IsNotRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ DBCardChoice | TriggerDescription$ When CARDNAME enters, each player chooses five lands they control and sacrifices the rest. +SVar:DBCardChoice:DB$ ChooseCard | Defined$ Player | Choices$ Land | ControlledByPlayer$ Chooser | Amount$ 5 | ChoiceTitle$ Choose five lands to keep | Mandatory$ True | Reveal$ True | SubAbility$ SacRest +SVar:SacRest:DB$ SacrificeAll | ValidCards$ Land.nonChosenCard | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True S:Mode$ CantPlayLand | IsPresent$ Land | PresentCompare$ GE10 | Description$ Players can't play lands as long as ten or more lands are on the battlefield. SVar:NonStackingEffect:True AI:RemoveDeck:All AI:RemoveDeck:Random +DeckHas:Ability$Sacrifice Oracle:When Limited Resources enters, each player chooses five lands they control and sacrifices the rest.\nPlayers can't play lands as long as ten or more lands are on the battlefield. diff --git a/forge-gui/res/cardsfolder/m/myrkuls_edict.txt b/forge-gui/res/cardsfolder/m/myrkuls_edict.txt index 62037404491..15cf7651499 100644 --- a/forge-gui/res/cardsfolder/m/myrkuls_edict.txt +++ b/forge-gui/res/cardsfolder/m/myrkuls_edict.txt @@ -6,7 +6,7 @@ SVar:OneOppSac:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | SubA SVar:DBSac:DB$ Sacrifice | Defined$ ChosenPlayer | SacValid$ Creature | SubAbility$ DBCleanupChosen SVar:EachOppSac:DB$ Sacrifice | Defined$ Player.Opponent | SacValid$ Creature | StackDescription$ SpellDescription | SpellDescription$ 10—19 VERT Each opponent sacrifices a creature. SVar:SacTopPower:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSacAll | StackDescription$ SpellDescription | SpellDescription$ 20 VERT Each opponent sacrifices a creature with the greatest power among creatures that player controls. -SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | RememberChosen$ True +SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | Reveal$ True | RememberChosen$ True SVar:DBSacAll:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup SVar:DBCleanupChosen:DB$ Cleanup | ClearChosenPlayer$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/n/no_one_will_hear_your_cries.txt b/forge-gui/res/cardsfolder/n/no_one_will_hear_your_cries.txt index b5488eaf509..afd96b191e7 100644 --- a/forge-gui/res/cardsfolder/n/no_one_will_hear_your_cries.txt +++ b/forge-gui/res/cardsfolder/n/no_one_will_hear_your_cries.txt @@ -2,8 +2,7 @@ Name:No One Will Hear Your Cries ManaCost:no cost Types:Scheme T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, each opponent chooses a creature they control, then sacrifices the rest. -SVar:TrigChoose:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ ChooseCreature | SubAbility$ DBSacrificeAll -SVar:ChooseCreature:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.RememberedPlayerCtrl | ChoiceTitle$ Choose a creature | Mandatory$ True +SVar:TrigChoose:DB$ ChooseCard | Defined$ Opponent | Choices$ Creature | ControlledByPlayer$ Chooser | ChoiceTitle$ Choose a creature to keep | Mandatory$ True | Reveal$ True | SubAbility$ DBSacrificeAll SVar:DBSacrificeAll:DB$ SacrificeAll | ValidCards$ Creature.nonChosenCard+OppCtrl | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True Oracle:When you set this scheme in motion, each opponent chooses a creature they control, then sacrifices the rest. diff --git a/forge-gui/res/cardsfolder/p/perilous_predicament.txt b/forge-gui/res/cardsfolder/p/perilous_predicament.txt index e9ef0979e82..af39420a670 100644 --- a/forge-gui/res/cardsfolder/p/perilous_predicament.txt +++ b/forge-gui/res/cardsfolder/p/perilous_predicament.txt @@ -1,13 +1,10 @@ Name:Perilous Predicament ManaCost:4 B Types:Instant -A:SP$ RepeatEach | AILogic$ OpponentHasMultipleCreatures | RepeatPlayers$ Opponent | RepeatSubAbility$ DBChoose | SubAbility$ DBSacAll | SpellDescription$ Each opponent sacrifices an artifact creature and a nonartifact creature. -SVar:DBChoose:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.Artifact+RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True | ChoiceTitle$ Choose target artifact creature | AILogic$ WorstCard | SubAbility$ DBChoose2 -SVar:DBChoose2:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.nonArtifact+IsNotRemembered+RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True | ChoiceTitle$ Choose target nonartifact creature | AILogic$ WorstCard -SVar:DBSacAll:DB$ SacrificeAll | ValidCards$ Permanent.IsRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:SP$ Sacrifice | Defined$ Opponent | SacValid$ Creature.Artifact & Creature.nonArtifact | AILogic$ WorstCard | Mandatory$ True | SacEachValid$ True | SpellDescription$ Each opponent sacrifices an artifact creature and a nonartifact creature. SVar:NeedsToPlayVar:Z GE2 SVar:Z:SVar$Z1/Plus.Z2 SVar:Z1:Count$Valid Creature.nonArtifact+OppCtrl/LimitMax.1 SVar:Z2:Count$Valid Creature.Artifact+OppCtrl/LimitMax.1 +DeckHas:Ability$Sacrifice Oracle:Each opponent sacrifices an artifact creature and a nonartifact creature. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_dreadnought.txt b/forge-gui/res/cardsfolder/p/phyrexian_dreadnought.txt index 7a60ec0f363..f0f1804287e 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_dreadnought.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_dreadnought.txt @@ -4,7 +4,7 @@ Types:Artifact Creature Phyrexian Dreadnought PT:12/12 K:Trample T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ChooseCreatures | TriggerDescription$ When CARDNAME enters, sacrifice it unless you sacrifice any number of creatures with total power 12 or greater. -SVar:ChooseCreatures:DB$ ChooseCard | Defined$ You | Amount$ X | MinAmount$ 0 | Choices$ Creature.YouCtrl | ChoiceTitle$ Sacrifice any number of creatures with total power 12 or greater. | ChoiceZone$ Battlefield | RememberChosen$ True | SubAbility$ SacrificeSelf +SVar:ChooseCreatures:DB$ ChooseCard | Defined$ You | Amount$ X | MinAmount$ 0 | Choices$ Creature.YouCtrl | ChoiceTitle$ Sacrifice any number of creatures with total power 12 or greater. | ChoiceZone$ Battlefield | Reveal$ True | RememberChosen$ True | SubAbility$ SacrificeSelf SVar:SacrificeSelf:DB$ Sacrifice | ConditionCheckSVar$ TotalPower | ConditionSVarCompare$ LT12 | SubAbility$ SacrificeCreatures SVar:SacrificeCreatures:DB$ SacrificeAll | Defined$ Remembered | ConditionCheckSVar$ TotalPower | ConditionSVarCompare$ GE12 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True @@ -13,4 +13,5 @@ SVar:X:Count$Valid Creature.YouCtrl AI:RemoveDeck:Random SVar:NeedsToPlayVar:Y GE12 SVar:Y:Count$SumPower_Creature.YouCtrl+notnamedPhyrexian Dreadnought +DeckHas:Ability$Sacrifice Oracle:Trample\nWhen Phyrexian Dreadnought enters, sacrifice it unless you sacrifice any number of creatures with total power 12 or greater. diff --git a/forge-gui/res/cardsfolder/p/professor_onyx.txt b/forge-gui/res/cardsfolder/p/professor_onyx.txt index f4899c041bb..bf2895c72ea 100644 --- a/forge-gui/res/cardsfolder/p/professor_onyx.txt +++ b/forge-gui/res/cardsfolder/p/professor_onyx.txt @@ -8,7 +8,7 @@ SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 A:AB$ LoseLife | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Defined$ You | LifeAmount$ 1 | SubAbility$ DBDig | SpellDescription$ You lose 1 life. Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. SVar:DBDig:DB$ Dig | DigNum$ 3 | ChangeNum$ 1 | NoReveal$ True | DestinationZone2$ Graveyard | StackDescription$ {p:You} looks at the top three cards of their library. {p:You} puts one of them into their hand and the rest into their graveyard. A:AB$ RepeatEach | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | RepeatPlayers$ Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSac | SpellDescription$ Each opponent sacrifices a creature with the greatest power among creatures that player controls. -SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | RememberChosen$ True +SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | Reveal$ True | RememberChosen$ True SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup | StackDescription$ Each opponent sacrifices a creature with the greatest power among creatures they control. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True A:AB$ Repeat | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | RepeatSubAbility$ TrigDiscard | MaxRepeat$ 7 | StackDescription$ SpellDescription | SpellDescription$ Each opponent may discard a card. If they don't, they lose 3 life. Repeat this process six more times. diff --git a/forge-gui/res/cardsfolder/r/razias_purification.txt b/forge-gui/res/cardsfolder/r/razias_purification.txt index 113d674d76b..3da870fae22 100644 --- a/forge-gui/res/cardsfolder/r/razias_purification.txt +++ b/forge-gui/res/cardsfolder/r/razias_purification.txt @@ -1,9 +1,8 @@ Name:Razia's Purification ManaCost:4 R W Types:Sorcery -A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChooseSac | SubAbility$ DBSac | SpellDescription$ Each player chooses three permanents they control, then sacrifices the rest. -SVar:DBChooseSac:DB$ ChooseCard | Defined$ Remembered | Choices$ Permanent.RememberedPlayerCtrl | Amount$ 3 | ChoiceTitle$ Choose three cards not to be sacrificed | RememberChosen$ True | Mandatory$ True -SVar:DBSac:DB$ SacrificeAll | ValidCards$ Permanent.IsNotRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:SP$ ChooseCard | Defined$ Player | Choices$ Permanent | ControlledByPlayer$ Chooser | Amount$ 3 | ChoiceTitle$ Choose three permanents to keep | Mandatory$ True | Reveal$ True | SubAbility$ DBSac | StackDescription$ SpellDescription | SpellDescription$ Each player chooses three permanents they control, then sacrifices the rest. +SVar:DBSac:DB$ SacrificeAll | ValidCards$ Permanent.nonChosenCard +DeckHas:Ability$Sacrifice AI:RemoveDeck:All Oracle:Each player chooses three permanents they control, then sacrifices the rest. diff --git a/forge-gui/res/cardsfolder/r/regnas_sanction.txt b/forge-gui/res/cardsfolder/r/regnas_sanction.txt index 932592dc583..9bbc69b44da 100644 --- a/forge-gui/res/cardsfolder/r/regnas_sanction.txt +++ b/forge-gui/res/cardsfolder/r/regnas_sanction.txt @@ -2,15 +2,9 @@ Name:Regna's Sanction ManaCost:3 W Types:Sorcery A:SP$ AssignGroup | Defined$ Player | Choices$ FriendRepeat,FoeRepeat | AILogic$ FriendOrFoe | SpellDescription$ For each player, choose friend or foe. Each friend puts a +1/+1 counter on each creature they control. Each foe chooses one untapped creature they control, then taps the rest. -SVar:FriendRepeat:DB$ RepeatEach | RepeatPlayers$ Remembered | RepeatSubAbility$ DBPutCounter | ClearRememberedBeforeLoop$ True | StackDescription$ Each friend puts a +1/+1 counter on each creature they control. | SpellDescription$ Friend puts a +1/+1 counter on each creature they control. -SVar:DBPutCounter:DB$ PutCounterAll | ValidCards$ Creature.RememberedPlayerCtrl | CounterType$ P1P1 | CounterNum$ 1 | Placer$ Remembered -SVar:FoeRepeat:DB$ RepeatEach | AILogic$ OpponentHasMultipleCreatures | RepeatPlayers$ Remembered | ClearRememberedBeforeLoop$ True | RepeatSubAbility$ DBChoose | SubAbility$ DBTapAll | StackDescription$ Each foe chooses one untapped creature they control, then taps the rest. | SpellDescription$ Foe chooses one untapped creature they control, then taps the rest. -SVar:DBChoose:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.untapped+RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True | SubAbility$ DBImprint -# Need to imprint all non remembered cards -SVar:DBImprint:DB$ Pump | ImprintCards$ Valid Creature.IsNotRemembered+RememberedPlayerCtrl | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True -SVar:DBTapAll:DB$ TapAll | ValidCards$ Creature.IsImprinted | TapperController$ True | SubAbility$ DBCleanupAll -SVar:DBCleanupAll:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True | ClearChosenCard$ True +SVar:FriendRepeat:DB$ PutCounterAll | ValidCards$ Creature.RememberedPlayerCtrl | CounterType$ P1P1 | CounterNum$ 1 | Placer$ Controller | SpellDescription$ Each friend puts a +1/+1 counter on each creature they control. +SVar:FoeRepeat:DB$ ChooseCard | Defined$ Remembered | Choices$ Creature.untapped | ControlledByPlayer$ Chooser | Amount$ 1 | ChoiceTitle$ Choose one creature to keep untapped | Mandatory$ True | Reveal$ True | SubAbility$ DBTapAll | SpellDescription$ Each foe chooses one untapped creature they control, then taps the rest. +SVar:DBTapAll:DB$ TapAll | ValidCards$ Creature.nonChosenCard+RememberedPlayerCtrl | TapperController$ True SVar:NeedsToPlayVar:Z GE3 SVar:Z:SVar$Z1/Plus.Z2 SVar:Z1:Count$Valid Creature.YourTeamCtrl diff --git a/forge-gui/res/cardsfolder/r/revival_experiment.txt b/forge-gui/res/cardsfolder/r/revival_experiment.txt index 3e6e08cb2af..c598759eab6 100644 --- a/forge-gui/res/cardsfolder/r/revival_experiment.txt +++ b/forge-gui/res/cardsfolder/r/revival_experiment.txt @@ -1,11 +1,10 @@ Name:Revival Experiment ManaCost:4 B G Types:Sorcery -A:SP$ RepeatEach | RepeatTypesFrom$ Permanent.YouOwn | TypesFromZone$ Graveyard | RepeatSubAbility$ ChooseCard | SubAbility$ DBReturn | SpellDescription$ For each permanent type, return up to one card of that type from your graveyard to the battlefield. -SVar:ChooseCard:DB$ ChooseCard | Choices$ Card.ChosenType+YouOwn | ChoiceZone$ Graveyard | ChoiceTitle$ Choose up to one card of this type to return | ChoiceTitleAppend$ ChosenType | RememberChosen$ True -SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ Remembered | RememberChanged$ True | ForgetOtherRemembered$ True | SubAbility$ DBLoseLife -SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | SubAbility$ DBChange | StackDescription$ SpellDescription | SubAbility$ DBExile | SpellDescription$ You lose 3 life for each card returned this way. -SVar:DBExile:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ DBCleanup | SpellDescription$ Exile CARDNAME. +A:SP$ ChooseCard | Defined$ You | Choices$ Card.Permanent+YouOwn | ChoiceZone$ Graveyard | ChooseEach$ Artifact & Battle & Creature & Enchantment & Land & Planeswalker | ControlledByPlayer$ Chooser | MinAmount$ 0 | Amount$ 1 | Reveal$ True | RememberChosen$ True | SubAbility$ DBReturn | StackDescription$ REP return_{p:You} returns & from your_from their & You lose_{p:You} loses & Exile_{p:You} exiles | SpellDescription$ For each permanent type, return up to one card of that type from your graveyard to the battlefield. You lose 3 life for each card returned this way. Exile CARDNAME. +SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ Remembered | RememberChanged$ True | ForgetOtherRemembered$ True | SubAbility$ DBLoseLife | StackDescription$ None +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | SubAbility$ DBChange | SubAbility$ DBExile | StackDescription$ None +SVar:DBExile:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ DBCleanup | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True SVar:X:Remembered$Amount/Times.3 DeckHas:Ability$Graveyard diff --git a/forge-gui/res/cardsfolder/rebalanced/a-incriminate.txt b/forge-gui/res/cardsfolder/rebalanced/a-incriminate.txt index 2bdb33ba162..6a781388f2a 100644 --- a/forge-gui/res/cardsfolder/rebalanced/a-incriminate.txt +++ b/forge-gui/res/cardsfolder/rebalanced/a-incriminate.txt @@ -5,4 +5,5 @@ A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Choose two target creatures contro SVar:DBChooseSac:DB$ ChooseCard | Choices$ Card.IsRemembered | Defined$ TargetedController | ChoiceTitle$ Choose one to sacrifice | SubAbility$ DBSac | StackDescription$ None | AILogic$ WorstCard SVar:DBSac:DB$ SacrificeAll | Defined$ ChosenCard | SubAbility$ DBCleanup | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Sacrifice Oracle:Choose two target creatures controlled by the same player. That player sacrifices one of them. diff --git a/forge-gui/res/cardsfolder/s/shadowgrange_archfiend.txt b/forge-gui/res/cardsfolder/s/shadowgrange_archfiend.txt index 8409c6306be..17c9c90beea 100644 --- a/forge-gui/res/cardsfolder/s/shadowgrange_archfiend.txt +++ b/forge-gui/res/cardsfolder/s/shadowgrange_archfiend.txt @@ -4,7 +4,7 @@ Types:Creature Demon PT:8/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRepeat | TriggerDescription$ When CARDNAME enters, each opponent sacrifices a creature with the greatest power among creatures they control. You gain life equal to the greatest power among creatures sacrificed this way. SVar:TrigRepeat:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSac -SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | ImprintChosen$ True | AILogic$ WorstCard +SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | Reveal$ True | ImprintChosen$ True | AILogic$ WorstCard SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsImprinted | RememberSacrificed$ True | SubAbility$ DBLifeGain SVar:DBLifeGain:DB$ GainLife | Defined$ You | LifeAmount$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True | ClearChosenCard$ True diff --git a/forge-gui/res/cardsfolder/s/single_combat.txt b/forge-gui/res/cardsfolder/s/single_combat.txt index bba9e35fa86..b487f78852d 100644 --- a/forge-gui/res/cardsfolder/s/single_combat.txt +++ b/forge-gui/res/cardsfolder/s/single_combat.txt @@ -1,11 +1,10 @@ Name:Single Combat ManaCost:3 W W Types:Sorcery -A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChoose | SubAbility$ SacAllOthers | SpellDescription$ Each player chooses a creature or planeswalker they control, then sacrifices the rest. Players can't cast creature or planeswalker spells until the end of your next turn. -SVar:DBChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature,Planeswalker | TargetControls$ True | Mandatory$ True | RememberChosen$ True -SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Creature.IsNotRemembered,Planeswalker.IsNotRemembered | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | StaticAbilities$ STCantBeCast | Duration$ UntilTheEndOfYourNextTurn | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True +A:SP$ ChooseCard | Defined$ Player | Choices$ Creature,Planeswalker | ControlledByPlayer$ Chooser | ChoiceTitle$ Choose a creature or planeswalker to keep | Mandatory$ True | Reveal$ True | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ Each player chooses a creature or planeswalker they control, then sacrifices the rest. Players can't cast creature or planeswalker spells until the end of your next turn. +SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Creature.nonChosenCard,Planeswalker.nonChosenCard | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | StaticAbilities$ STCantBeCast | Duration$ UntilTheEndOfYourNextTurn SVar:STCantBeCast:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Creature,Planeswalker | Description$ Players can't cast creature or planeswalker spells. AI:RemoveDeck:All +DeckHas:Ability$Sacrifice Oracle:Each player chooses a creature or planeswalker they control, then sacrifices the rest. Players can't cast creature or planeswalker spells until the end of your next turn. diff --git a/forge-gui/res/cardsfolder/s/slaughter_the_strong.txt b/forge-gui/res/cardsfolder/s/slaughter_the_strong.txt index fd1d3e31bf6..01105646308 100644 --- a/forge-gui/res/cardsfolder/s/slaughter_the_strong.txt +++ b/forge-gui/res/cardsfolder/s/slaughter_the_strong.txt @@ -2,8 +2,9 @@ Name:Slaughter the Strong ManaCost:1 W W Types:Sorcery A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ ChooseCrtr | SubAbility$ SacAllOthers | SpellDescription$ Each player chooses any number of creatures they control with total power 4 or less, then sacrifices all other creatures they control. -SVar:ChooseCrtr:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl | WithTotalPower$ 4 | RememberChosen$ True | AILogic$ NegativePowerFirst +SVar:ChooseCrtr:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl | WithTotalPower$ 4 | Reveal$ True | RememberChosen$ True | AILogic$ NegativePowerFirst SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Creature.IsNotRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All +DeckHas:Ability$Sacrifice Oracle:Each player chooses any number of creatures they control with total power 4 or less, then sacrifices all other creatures they control. diff --git a/forge-gui/res/cardsfolder/s/soul_shatter.txt b/forge-gui/res/cardsfolder/s/soul_shatter.txt index 3e620e83a71..ba7a20060d7 100644 --- a/forge-gui/res/cardsfolder/s/soul_shatter.txt +++ b/forge-gui/res/cardsfolder/s/soul_shatter.txt @@ -2,7 +2,7 @@ Name:Soul Shatter ManaCost:2 B Types:Instant A:SP$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChoose | SubAbility$ DBSac | StackDescription$ Each opponent | SpellDescription$ Each opponent sacrifices a creature or planeswalker with the highest mana value among creatures and planeswalkers they control. -SVar:DBChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl+cmcEQX,Planeswalker.RememberedPlayerCtrl+cmcEQX | ChoiceTitle$ Choose a creature or planeswalker with the highest mana value to sacrifice | Mandatory$ True | RememberChosen$ True +SVar:DBChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl+cmcEQX,Planeswalker.RememberedPlayerCtrl+cmcEQX | ChoiceTitle$ Choose a creature or planeswalker with the highest mana value to sacrifice | Mandatory$ True | Reveal$ True | RememberChosen$ True SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup | StackDescription$ sacrifices a creature or planeswalker with the highest mana value among creatures and planeswalkers they control. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Creature.RememberedPlayerCtrl,Planeswalker.RememberedPlayerCtrl$GreatestCMC diff --git a/forge-gui/res/cardsfolder/s/stick_together.txt b/forge-gui/res/cardsfolder/s/stick_together.txt index 948b6415436..82231fab830 100644 --- a/forge-gui/res/cardsfolder/s/stick_together.txt +++ b/forge-gui/res/cardsfolder/s/stick_together.txt @@ -1,7 +1,7 @@ Name:Stick Together ManaCost:3 W W Types:Sorcery -A:SP$ ChooseCard | Defined$ Player | ChooseEach$ Party | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ Each player chooses a party from among creatures they control, +A:SP$ ChooseCard | Defined$ Player | Choices$ Creature | ChooseEach$ Party | Reveal$ True | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ Each player chooses a party from among creatures they control, SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Creature.nonChosenCard | StackDescription$ then sacrifices the rest. | SpellDescription$ then sacrifices the rest. (To choose a party, choose up to one each of Cleric, Rogue, Warrior, and Wizard.) DeckHas:Ability$Sacrifice DeckHints:Ability$Party diff --git a/forge-gui/res/cardsfolder/s/szats_will.txt b/forge-gui/res/cardsfolder/s/szats_will.txt index 9543a16d11c..b8c91617c87 100644 --- a/forge-gui/res/cardsfolder/s/szats_will.txt +++ b/forge-gui/res/cardsfolder/s/szats_will.txt @@ -3,7 +3,7 @@ ManaCost:4 B Types:Instant A:SP$ Charm | MinCharmNum$ 1 | CharmNum$ Count$Compare Y GE1.2.1 | Choices$ DBOppSac,DBExile | AdditionalDescription$ . If you control a commander as you cast this spell, you may choose both. SVar:DBOppSac:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSac | SpellDescription$ Each opponent sacrifices a creature they control with the greatest power. -SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | RememberChosen$ True +SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | Reveal$ True | RememberChosen$ True SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True SVar:DBExile:DB$ ChangeZoneAll | ChangeType$ Card.OppCtrl | Origin$ Graveyard | Destination$ Exile | RememberChanged$ True | SubAbility$ DBToken | SpellDescription$ Exile all cards from all opponents' graveyards, then create X 0/1 black Thrull creature tokens, where X is the greatest power among creature cards exiled this way. diff --git a/forge-gui/res/cardsfolder/t/the_eternal_wanderer.txt b/forge-gui/res/cardsfolder/t/the_eternal_wanderer.txt index 94d2f2f9db5..2d1d1671ab6 100644 --- a/forge-gui/res/cardsfolder/t/the_eternal_wanderer.txt +++ b/forge-gui/res/cardsfolder/t/the_eternal_wanderer.txt @@ -9,7 +9,7 @@ SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defi SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ Token | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | TokenScript$ w_2_2_samurai_double_strike | SpellDescription$ Create a 2/2 white Samurai creature token with double strike. A:AB$ RepeatEach | Cost$ SubCounter<4/LOYALTY> | Planeswalker$ True | RepeatPlayers$ Player | RepeatSubAbility$ DBChoose | SubAbility$ DBSacAll | StackDescription$ SpellDescription | SpellDescription$ For each player, choose a creature that player controls. Each player sacrifices all creatures they control not chosen this way. -SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Creature.RememberedPlayerCtrl | Mandatory$ True | Amount$ 1 | ChoiceTitle$ Choose a creature this player controls | ImprintChosen$ True +SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Creature | ControlledByPlayer$ Remembered | ChoiceTitle$ Choose a creature this player controls | Mandatory$ True | Reveal$ True | ImprintChosen$ True SVar:DBSacAll:DB$ SacrificeAll | ValidCards$ Creature.IsNotImprinted | SubAbility$ DBCleanup2 | StackDescription$ None SVar:DBCleanup2:DB$ Cleanup | ClearChosenCard$ True | ClearImprinted$ True DeckHas:Ability$Token|Sacrifice & Type$Samurai diff --git a/forge-gui/res/cardsfolder/t/tragic_arrogance.txt b/forge-gui/res/cardsfolder/t/tragic_arrogance.txt index b744841bc8d..594886aa4d6 100644 --- a/forge-gui/res/cardsfolder/t/tragic_arrogance.txt +++ b/forge-gui/res/cardsfolder/t/tragic_arrogance.txt @@ -1,12 +1,10 @@ Name:Tragic Arrogance ManaCost:3 W W Types:Sorcery -A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ ChooseArtf | SubAbility$ SacAllOthers | SpellDescription$ For each player, you choose from among the permanents that player controls an artifact, a creature, an enchantment, and a planeswalker. Then each player sacrifices all other nonland permanents they control. -SVar:ChooseArtf:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Artifact.RememberedPlayerCtrl | ChoiceTitle$ Choose an artifact to keep | SubAbility$ ChooseCrtr | RememberChosen$ True | Mandatory$ True -SVar:ChooseCrtr:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.RememberedPlayerCtrl | ChoiceTitle$ Choose a creature to keep | SubAbility$ ChooseEnch | RememberChosen$ True | Mandatory$ True -SVar:ChooseEnch:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Enchantment.RememberedPlayerCtrl | ChoiceTitle$ Choose an enchantment to keep | SubAbility$ ChoosePW | RememberChosen$ True | Mandatory$ True -SVar:ChoosePW:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Planeswalker.RememberedPlayerCtrl | ChoiceTitle$ Choose a planeswalker to keep | RememberChosen$ True | Mandatory$ True -SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.nonLand+IsNotRemembered | SubAbility$ DBCleanup +A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ YouChoose | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ For each player, you choose from among the permanents that player controls an artifact, a creature, an enchantment, and a planeswalker. Then each player sacrifices all other nonland permanents they control. +SVar:YouChoose:DB$ ChooseCard | Defined$ You | Choices$ Permanent | ChooseEach$ Artifact & Creature & Enchantment & Planeswalker | ControlledByPlayer$ Remembered | RememberChosen$ True | Mandatory$ True | Reveal$ True +SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.nonLand+IsNotRemembered | SubAbility$ DBCleanup | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All +DeckHas:Ability$Sacrifice Oracle:For each player, you choose from among the permanents that player controls an artifact, a creature, an enchantment, and a planeswalker. Then each player sacrifices all other nonland permanents they control. From 86294108eb7c82409bea760beb1fdb1a220827b9 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Thu, 19 Sep 2024 09:27:56 +0200 Subject: [PATCH 23/37] Update grist_voracious_larva_grist_the_plague_swarm.txt --- .../g/grist_voracious_larva_grist_the_plague_swarm.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/g/grist_voracious_larva_grist_the_plague_swarm.txt b/forge-gui/res/cardsfolder/g/grist_voracious_larva_grist_the_plague_swarm.txt index 58a2687a0b0..c7243852570 100644 --- a/forge-gui/res/cardsfolder/g/grist_voracious_larva_grist_the_plague_swarm.txt +++ b/forge-gui/res/cardsfolder/g/grist_voracious_larva_grist_the_plague_swarm.txt @@ -22,7 +22,7 @@ A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 SVar:DBMill:DB$ Mill | Defined$ You | NumCards$ 2 | RememberMilled$ True | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | Defined$ Imprinted | CounterType$ Deathtouch | CounterNum$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.Black | ConditionCompare$ EQ1 | SubAbility$ DBCleanup A:AB$ Destroy | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -A:AB$ CopyPermanent | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ ValidGraveyard Creature.YouOwn | SetPower$ 1 | SetToughness$ 1 | SetColor$ Black & Green | SetCreatureTypes$ Insect | AILogic$ DuplicatePerms | SpellDescription$ For each creature card in your graveyard, create a token that's a copy of it, except it's a 1/1 black and green Insect. +A:AB$ CopyPermanent | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ ValidGraveyard Creature.YouOwn | SetPower$ 1 | SetToughness$ 1 | SetColor$ Black,Green | SetCreatureTypes$ Insect | AILogic$ DuplicatePerms | SpellDescription$ For each creature card in your graveyard, create a token that's a copy of it, except it's a 1/1 black and green Insect. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True DeckHas:Ability$Token|Mill Oracle:[+1]: Create a 1/1 black and green Insect creature token, then mill two cards. Put a deathtouch counter on the token if a black card was milled this way.\n[-2]: Destroy target artifact or enchantment.\n[-6]: For each creature card in your graveyard, create a token that's a copy of it, except it's a 1/1 black and green Insect. From 869db7febbafa1dce24d444acb41b292332a8cc7 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Thu, 19 Sep 2024 09:36:13 +0200 Subject: [PATCH 24/37] Impending NonCreature as StaticAbility (#6177) --- .../java/forge/game/card/CardFactoryUtil.java | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index f41c599030b..4d64ee8fb2d 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1415,7 +1415,7 @@ public class CardFactoryUtil { inst.addTrigger(trigger); } else if (keyword.startsWith("Impending")) { // Remove Time counter trigger - final String endTrig = "Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_GE1_TIME" + + final String endTrig = "Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.Self+impended+counters_GE1_TIME" + " | Secondary$ True | TriggerDescription$ At the beginning of your end step, remove a time counter from it."; final String remove = "DB$ RemoveCounter | Defined$ Self | CounterType$ TIME | CounterNum$ 1"; @@ -2354,17 +2354,7 @@ public class CardFactoryUtil { final String effect = "DB$ PutCounter | Defined$ ReplacedCard | CounterType$ TIME | CounterNum$ " + m + " | ETB$ True | SpellDescription$ " + desc; - SpellAbility repAb = AbilityFactory.getAbility(effect, card); - - String staticEffect = "DB$ Effect | StaticAbilities$ NoCreature | ExileOnCounter$ TIME | Duration$ UntilHostLeavesPlay"; - - String staticNoCreature = "Mode$ Continuous | Affected$ Card.EffectSource+counters_GE1_TIME | RemoveType$ Creature | Description$ EFFECTSOURCE isn't a creature."; - - AbilitySub effectAb = (AbilitySub)AbilityFactory.getAbility(staticEffect, card); - effectAb.setSVar("NoCreature", staticNoCreature); - repAb.setSubAbility(effectAb); - - final ReplacementEffect re = createETBReplacement(card, ReplacementLayer.Other, repAb, false, true, intrinsic, "Card.Self+impended", ""); + final ReplacementEffect re = createETBReplacement(card, ReplacementLayer.Other, effect, false, true, intrinsic, "Card.Self+impended", ""); inst.addReplacement(re); } else if (keyword.equals("Jump-start")) { @@ -3998,6 +3988,9 @@ public class CardFactoryUtil { String effect = "Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withoutHorsemanship | Secondary$ True " + " | Description$ Horsemanship (" + inst.getReminderText() + ")"; inst.addStaticAbility(StaticAbility.create(effect, state.getCard(), state, intrinsic)); + } else if (keyword.startsWith("Impending")) { + String effect = "Mode$ Continuous | Affected$ Card.Self+impended+counters_GE1_TIME | RemoveType$ Creature | Secondary$ True"; + inst.addStaticAbility(StaticAbility.create(effect, state.getCard(), state, intrinsic)); } else if (keyword.equals("Intimidate")) { String effect = "Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonArtifact+!SharesColorWith | Secondary$ True " + " | Description$ Intimidate (" + inst.getReminderText() + ")"; From 7a192a687396a78da1a3a18436f628b3b6c38e92 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Fri, 20 Sep 2024 11:53:07 +0200 Subject: [PATCH 25/37] Fix Valiant triggers failing if another player targets first (#6178) --- .../src/main/java/forge/game/ability/AbilityKey.java | 1 + forge-game/src/main/java/forge/game/card/Card.java | 8 +++++++- .../game/spellability/SpellAbilityStackInstance.java | 11 +++++++---- .../java/forge/game/trigger/TriggerBecomesTarget.java | 6 ++++++ .../src/main/java/forge/game/zone/MagicStack.java | 10 ++++++++-- forge-gui/res/cardsfolder/e/emberheart_challenger.txt | 2 +- .../res/cardsfolder/f/flowerfoot_swordmaster.txt | 2 +- forge-gui/res/cardsfolder/h/heartfire_hero.txt | 2 +- forge-gui/res/cardsfolder/m/mouse_trapper.txt | 2 +- forge-gui/res/cardsfolder/n/nettle_guard.txt | 2 +- forge-gui/res/cardsfolder/s/seedglaive_mentor.txt | 2 +- forge-gui/res/cardsfolder/v/veteran_guardmouse.txt | 2 +- forge-gui/res/cardsfolder/w/whiskerquill_scribe.txt | 2 +- .../res/cardsfolder/w/whiskervale_forerunner.txt | 2 +- 14 files changed, 38 insertions(+), 16 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 b38511f39dd..7eda7e340bc 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityKey.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityKey.java @@ -137,6 +137,7 @@ public enum AbilityKey { Targets("Targets"), Token("Token"), TokenNum("TokenNum"), + Valiant("Valiant"), Vehicle("Vehicle"), Won("Won"), 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 16abe732e94..df4e2fc8cfe 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -188,7 +188,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr private boolean startsGameInPlay = false; private boolean drawnThisTurn = false; private boolean foughtThisTurn = false; - private boolean becameTargetThisTurn = false; + private boolean becameTargetThisTurn, valiant = false; private boolean enlistedThisCombat = false; private boolean startedTheTurnUntapped = false; private boolean cameUnderControlSinceLastUpkeep = true; // for Echo @@ -3702,6 +3702,12 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr public void setBecameTargetThisTurn(boolean becameTargetThisTurn0) { becameTargetThisTurn = becameTargetThisTurn0; } + public boolean isValiant() { + return valiant; + } + public void setValiant(boolean v) { + valiant = v; + } public boolean hasStartedTheTurnUntapped() { return startedTheTurnUntapped; diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java index 0cb1fe08e9a..cfabe419fa2 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java @@ -144,9 +144,6 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { view.updateTargetPlayers(this); view.updateText(this); - // Run BecomesTargetTrigger - Map runParams = AbilityKey.newMap(); - runParams.put(AbilityKey.SourceSA, ability); Set distinctObjects = Sets.newHashSet(); for (final GameObject tgt : target) { if (oldTarget != null && oldTarget.contains(tgt)) { @@ -157,16 +154,22 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { continue; } + Map runParams = AbilityKey.newMap(); + runParams.put(AbilityKey.SourceSA, ability); if (tgt instanceof Card && !((Card) tgt).hasBecomeTargetThisTurn()) { runParams.put(AbilityKey.FirstTime, null); ((Card) tgt).setBecameTargetThisTurn(true); } + if (tgt instanceof Card && !((Card) tgt).isValiant() && cause.getController().equals(((Card) tgt).getController())) { + runParams.put(AbilityKey.Valiant, null); + ((Card) tgt).setValiant(true); + } runParams.put(AbilityKey.Target, tgt); getSourceCard().getGame().getTriggerHandler().runTrigger(TriggerType.BecomesTarget, runParams, false); } // Only run BecomesTargetOnce when at least one target is changed if (!distinctObjects.isEmpty()) { - runParams = AbilityKey.newMap(); + Map runParams = AbilityKey.newMap(); runParams.put(AbilityKey.SourceSA, ability); runParams.put(AbilityKey.Targets, distinctObjects); runParams.put(AbilityKey.Cause, cause); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java index 798dcf8938d..e93340144e5 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java @@ -77,6 +77,12 @@ public class TriggerBecomesTarget extends Trigger { } } + if (hasParam("Valiant")) { + if (!runParams.containsKey(AbilityKey.Valiant)) { + return false; + } + } + return true; } diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 99fb6e0e15d..e60c7535549 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -437,13 +437,11 @@ public class MagicStack /* extends MyObservable */ implements Iterable chosenTargets = sp.getAllTargetChoices(); if (!chosenTargets.isEmpty()) { - runParams = AbilityKey.newMap(); SpellAbility s = sp; if (si != null) { s = si.getSpellAbility(); chosenTargets = s.getAllTargetChoices(); } - runParams.put(AbilityKey.SourceSA, s); Set distinctObjects = Sets.newHashSet(); for (final TargetChoices tc : chosenTargets) { for (final GameObject tgt : tc) { @@ -453,14 +451,22 @@ public class MagicStack /* extends MyObservable */ implements Iterable | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. Oracle:Valiant — Whenever Nettle Guard becomes the target of a spell or ability you control for the first time each turn, it gets +0/+2 until end of turn.\n{1}, Sacrifice Nettle Guard: Destroy target artifact or enchantment. diff --git a/forge-gui/res/cardsfolder/s/seedglaive_mentor.txt b/forge-gui/res/cardsfolder/s/seedglaive_mentor.txt index 172c400e626..68aa479bcb7 100644 --- a/forge-gui/res/cardsfolder/s/seedglaive_mentor.txt +++ b/forge-gui/res/cardsfolder/s/seedglaive_mentor.txt @@ -4,7 +4,7 @@ Types:Creature Mouse Soldier PT:3/2 K:Vigilance K:Haste -T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | FirstTime$ True | Execute$ TrigCounter | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, put a +1/+1 counter on it. +T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | Valiant$ True | Execute$ TrigCounter | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, put a +1/+1 counter on it. SVar:TrigCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 DeckHas:Ability$Counters Oracle:Vigilance, haste\nValiant — Whenever Seedglaive Mentor becomes the target of a spell or ability you control for the first time each turn, put a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/v/veteran_guardmouse.txt b/forge-gui/res/cardsfolder/v/veteran_guardmouse.txt index e336021430b..3ab4e9b13d4 100644 --- a/forge-gui/res/cardsfolder/v/veteran_guardmouse.txt +++ b/forge-gui/res/cardsfolder/v/veteran_guardmouse.txt @@ -2,7 +2,7 @@ Name:Veteran Guardmouse ManaCost:3 RW Types:Creature Mouse Soldier PT:3/4 -T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | FirstTime$ True | Execute$ TrigPump | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, it gets +1/+0 and gains first strike until end of turn. Scry 1. (Look at the top card of your library. You may put that card on the bottom.) +T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | Valiant$ True | Execute$ TrigPump | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, it gets +1/+0 and gains first strike until end of turn. Scry 1. (Look at the top card of your library. You may put that card on the bottom.) SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | KW$ First Strike | SubAbility$ DBScry SVar:DBScry:DB$ Scry | ScryNum$ 1 Oracle:Valiant — Whenever Veteran Guardmouse becomes the target of a spell or ability you control for the first time each turn, it gets +1/+0 and gains first strike until end of turn. Scry 1. (Look at the top card of your library. You may put that card on the bottom.) diff --git a/forge-gui/res/cardsfolder/w/whiskerquill_scribe.txt b/forge-gui/res/cardsfolder/w/whiskerquill_scribe.txt index ecd34becec1..2eaee9c46e3 100644 --- a/forge-gui/res/cardsfolder/w/whiskerquill_scribe.txt +++ b/forge-gui/res/cardsfolder/w/whiskerquill_scribe.txt @@ -2,6 +2,6 @@ Name:Whiskerquill Scribe ManaCost:1 R Types:Creature Mouse Citizen PT:2/2 -T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | FirstTime$ True | Execute$ TrigDraw | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, you may discard a card. If you do, draw a card. +T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | Valiant$ True | Execute$ TrigDraw | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, you may discard a card. If you do, draw a card. SVar:TrigDraw:AB$ Draw | Cost$ Discard<1/Card> Oracle:Valiant — Whenever Whiskerquill Scribe becomes the target of a spell or ability you control for the first time each turn, you may discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/w/whiskervale_forerunner.txt b/forge-gui/res/cardsfolder/w/whiskervale_forerunner.txt index e9211f23507..25a829c7afb 100644 --- a/forge-gui/res/cardsfolder/w/whiskervale_forerunner.txt +++ b/forge-gui/res/cardsfolder/w/whiskervale_forerunner.txt @@ -2,7 +2,7 @@ Name:Whiskervale Forerunner ManaCost:3 W Types:Creature Mouse Bard PT:3/4 -T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | FirstTime$ True | Execute$ TrigPeekAndReveal | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, look at the top five cards of your library. You may reveal a creature card with mana value 3 or less from among them. You may put it onto the battlefield if it's your turn. If you don't put it onto the battlefield, put it into your hand. Put the rest on the bottom of your library in a random order. +T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | Valiant$ True | Execute$ TrigPeekAndReveal | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, look at the top five cards of your library. You may reveal a creature card with mana value 3 or less from among them. You may put it onto the battlefield if it's your turn. If you don't put it onto the battlefield, put it into your hand. Put the rest on the bottom of your library in a random order. SVar:TrigPeekAndReveal:DB$ PeekAndReveal | Defined$ You | PeekAmount$ 5 | NoReveal$ True | RememberPeeked$ True | SubAbility$ PickOne SVar:PickOne:DB$ ChooseCard | Defined$ You | Amount$ 1 | ChoiceTitle$ Choose a creature card to reveal | Choices$ Card.Creature+cmcLE3+IsRemembered | ChoiceZone$ Library | Reveal$ True | SubAbility$ DBChangeZoneBattlefield SVar:DBChangeZoneBattlefield:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Defined$ ChosenCard | ConditionPlayerTurn$ True | ConditionDefined$ Remembered | ConditionPresent$ Card.ChosenCard | ConditionCompare$ EQ1 | Optional$ True | SubAbility$ DBChangeZoneHand From a67ab2818b30aaaa5521ddf5cec642bdae8d1c26 Mon Sep 17 00:00:00 2001 From: Renato Filipe Vidal Santos <45150760+dracontes@users.noreply.github.com> Date: Fri, 20 Sep 2024 15:59:41 +0100 Subject: [PATCH 26/37] Fixes gleaned from notes: pass #3 (#6179) --- forge-gui/res/cardsfolder/a/agatha_of_the_vile_cauldron.txt | 4 ++-- forge-gui/res/cardsfolder/c/combustible_gearhulk.txt | 4 ++-- forge-gui/res/cardsfolder/d/doors_of_durin.txt | 2 +- .../g/grist_voracious_larva_grist_the_plague_swarm.txt | 2 +- forge-gui/res/cardsfolder/i/isolated_watchtower.txt | 5 +++-- forge-gui/res/cardsfolder/p/palantir_of_orthanc.txt | 4 ++-- forge-gui/res/cardsfolder/u/urza_assembles_the_titans.txt | 5 +++-- 7 files changed, 14 insertions(+), 12 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/agatha_of_the_vile_cauldron.txt b/forge-gui/res/cardsfolder/a/agatha_of_the_vile_cauldron.txt index 3b89c7aa7a2..1b45252a82a 100644 --- a/forge-gui/res/cardsfolder/a/agatha_of_the_vile_cauldron.txt +++ b/forge-gui/res/cardsfolder/a/agatha_of_the_vile_cauldron.txt @@ -2,7 +2,7 @@ Name:Agatha of the Vile Cauldron ManaCost:R G Types:Legendary Creature Human Warlock PT:1/1 -S:Mode$ ReduceCost | ValidCard$ Creature.YouCtrl | Type$ Ability | Amount$ X | MinMana$ 1 | AffectedZone$ Battlefield | Description$ Activated abilities of creatures you control cost X less to activate, where X is CARDNAME's power. This effect can't reduce the mana in that cost to less than one mana. +S:Mode$ ReduceCost | ValidCard$ Creature.YouCtrl | Type$ Ability | Amount$ X | MinMana$ 1 | AffectedZone$ Battlefield | Description$ Activated abilities of creatures you control cost {X} less to activate, where X is CARDNAME's power. This effect can't reduce the mana in that cost to less than one mana. A:AB$ PumpAll | Cost$ 4 R G | ValidCards$ Creature.YouCtrl+StrictlyOther | NumAtt$ +1 | NumDef$ +1 | KW$ Trample & Haste | SpellDescription$ Other creatures you control get +1/+1 and gain trample and haste until end of turn. SVar:X:Count$CardPower -Oracle:Activated abilities of creatures you control cost X less to activate, where X is Agatha of the Vile Cauldron's power. This effect can't reduce the mana in that cost to less than one mana.\n{4}{R}{G}: Other creatures you control get +1/+1 and gain trample and haste until end of turn. +Oracle:Activated abilities of creatures you control cost {X} less to activate, where X is Agatha of the Vile Cauldron's power. This effect can't reduce the mana in that cost to less than one mana.\n{4}{R}{G}: Other creatures you control get +1/+1 and gain trample and haste until end of turn. diff --git a/forge-gui/res/cardsfolder/c/combustible_gearhulk.txt b/forge-gui/res/cardsfolder/c/combustible_gearhulk.txt index 9abc89e6b2e..25a5139f022 100644 --- a/forge-gui/res/cardsfolder/c/combustible_gearhulk.txt +++ b/forge-gui/res/cardsfolder/c/combustible_gearhulk.txt @@ -5,8 +5,8 @@ PT:6/6 K:First Strike T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBChoice | TriggerDescription$ When CARDNAME enters, target opponent may have you draw three cards. If the player doesn't, you mill three cards, then CARDNAME deals damage to that player equal to the total mana value of those cards. SVar:DBChoice:DB$ GenericChoice | ValidTgts$ Opponent | Choices$ CombustDraw,CombustDamage | AILogic$ CombustibleGearhulk -SVar:CombustDraw:DB$ Draw | Defined$ You | NumCards$ 3 | SpellDescription$ Controller draws three cards -SVar:CombustDamage:DB$ Mill | Defined$ You | NumCards$ 3 | RememberMilled$ True | SubAbility$ DamageOpponent | SpellDescription$ Controller mills three cards, then CARDNAME deals damage to you equal to their total mana value. +SVar:CombustDraw:DB$ Draw | Defined$ You | NumCards$ 3 | SpellDescription$ CARDNAME's controller draws three cards. +SVar:CombustDamage:DB$ Mill | Defined$ You | NumCards$ 3 | RememberMilled$ True | SubAbility$ DamageOpponent | SpellDescription$ CARDNAME's controller mills three cards, then it deals damage to you equal to the total mana value of those cards. SVar:DamageOpponent:DB$ DealDamage | Defined$ ParentTarget | NumDmg$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$SumCMC diff --git a/forge-gui/res/cardsfolder/d/doors_of_durin.txt b/forge-gui/res/cardsfolder/d/doors_of_durin.txt index d2d0869268c..21774017b8d 100644 --- a/forge-gui/res/cardsfolder/d/doors_of_durin.txt +++ b/forge-gui/res/cardsfolder/d/doors_of_durin.txt @@ -3,7 +3,7 @@ ManaCost:3 R G Types:Legendary Artifact T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigScry | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, scry 2, then you may reveal the top card of your library. If it's a creature card, put it onto the battlefield tapped and attacking. Until your next turn, it gains trample if you control a Dwarf and hexproof if you control an Elf. SVar:TrigScry:DB$ Scry | ScryNum$ 2 | SubAbility$ DBDig -SVar:DBDig:DB$ Dig | DigNum$ 1 | ChangeNum$ All | Optional$ True | Reveal$ True | ChangeValid$ Creature | DestinationZone$ Battlefield | Tapped$ True | Attacking$ True | RememberChanged$ True | SubAbility$ DBPumpTrample +SVar:DBDig:DB$ Dig | DigNum$ 1 | ChangeNum$ All | RevealOptional$ True | RememberRevealed$ True | ChangeValid$ Creature.IsRemembered | DestinationZone$ Battlefield | Tapped$ True | Attacking$ True | SubAbility$ DBPumpTrample SVar:DBPumpTrample:DB$ Pump | Defined$ Remembered | KW$ Trample | Duration$ UntilYourNextTurn | ConditionPresent$ Dwarf.YouCtrl | SubAbility$ DBPumpHexproof SVar:DBPumpHexproof:DB$ Pump | Defined$ Remembered | KW$ Hexproof | Duration$ UntilYourNextTurn | ConditionPresent$ Elf.YouCtrl | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/g/grist_voracious_larva_grist_the_plague_swarm.txt b/forge-gui/res/cardsfolder/g/grist_voracious_larva_grist_the_plague_swarm.txt index c7243852570..5e7bae316b5 100644 --- a/forge-gui/res/cardsfolder/g/grist_voracious_larva_grist_the_plague_swarm.txt +++ b/forge-gui/res/cardsfolder/g/grist_voracious_larva_grist_the_plague_swarm.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Insect PT:1/2 K:Deathtouch T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Battlefield | ValidCard$ Card.Self,Creature.YouCtrl | Execute$ TrigTransform | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME or another creature you control enters, if it entered from your graveyard or you cast it from your graveyard, you may pay {G}. If you do, exile NICKNAME, then return it to the battlefield transformed under its owner's control. -T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self+wasCastFromYourGraveyardByYou,Creature.YouCtrl+wasCastFromYourGraveyardByYou | Execute$ TrigTransform | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ When CARDNAME enters, if it entered from your graveyard or you cast it from your graveyard, you may pay {G}. If you do, exile NICKNAME, then return it to the battlefield transformed under its owner's control. +T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self+wasCastFromYourGraveyardByYou,Creature.YouCtrl+wasCastFromYourGraveyardByYou | Execute$ TrigTransform | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ When CARDNAME or another creature you control enters, if it entered from your graveyard or you cast it from your graveyard, you may pay {G}. If you do, exile NICKNAME, then return it to the battlefield transformed under its owner's control. SVar:TrigTransform:AB$ ChangeZone | Cost$ G | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | Transformed$ True | ForgetOtherRemembered$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/i/isolated_watchtower.txt b/forge-gui/res/cardsfolder/i/isolated_watchtower.txt index 89c50f0a8c5..075f9f2e385 100644 --- a/forge-gui/res/cardsfolder/i/isolated_watchtower.txt +++ b/forge-gui/res/cardsfolder/i/isolated_watchtower.txt @@ -2,8 +2,9 @@ Name:Isolated Watchtower ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. -A:AB$ Scry | Cost$ 2 T | ScryNum$ 1 | SubAbility$ DBReveal | CheckSVar$ X | SVarCompare$ GEY | SpellDescription$ Scry 1, then you may reveal the top card of your library. If a basic land card is revealed this way, put it onto the battlefield tapped. Activate only if an opponent controls at least two more lands than you. -SVar:DBReveal:DB$ Dig | Optional$ True | DigNum$ 1 | Reveal$ True | ChangeValid$ Land.Basic | DestinationZone$ Battlefield | Tapped$ True | DestinationZone2$ Library | LibraryPosition2$ 0 +A:AB$ Scry | Cost$ 2 T | ScryNum$ 1 | SubAbility$ DBReveal | CheckSVar$ X | SVarCompare$ GEY | StackDescription$ REP Scry_{p:You} scries & you may_they may & your_their & put_{p:You} puts & . Activate only if an opponent controls at least two more lands than you._. | SpellDescription$ Scry 1, then you may reveal the top card of your library. If a basic land card is revealed this way, put it onto the battlefield tapped. Activate only if an opponent controls at least two more lands than you. +SVar:DBReveal:DB$ Dig | DigNum$ 1 | RevealOptional$ True | RememberRevealed$ True | ChangeValid$ Land.Basic+IsRemembered | ChangeNum$ All | DestinationZone$ Battlefield | Tapped$ True | DestinationZone2$ Library | LibraryPosition2$ 0 | SubAbility$ DBCleanup | StackDescription$ None +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:PlayerCountOpponents$HighestValid Land.YouCtrl SVar:Y:Count$Valid Land.YouCtrl/Plus.2 Oracle:{T}: Add {C}.\n{2}, {T}: Scry 1, then you may reveal the top card of your library. If a basic land card is revealed this way, put it onto the battlefield tapped. Activate only if an opponent controls at least two more lands than you. diff --git a/forge-gui/res/cardsfolder/p/palantir_of_orthanc.txt b/forge-gui/res/cardsfolder/p/palantir_of_orthanc.txt index 793a4854fc3..333b51f622b 100644 --- a/forge-gui/res/cardsfolder/p/palantir_of_orthanc.txt +++ b/forge-gui/res/cardsfolder/p/palantir_of_orthanc.txt @@ -5,8 +5,8 @@ T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefiel SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ INFLUENCE | CounterNum$ 1 | SubAbility$ DBScry SVar:DBScry:DB$ Scry | ScryNum$ 2 | SubAbility$ DBChoice SVar:DBChoice:DB$ GenericChoice | ValidTgts$ Opponent | Choices$ CombustDraw,CombustDamage | AILogic$ CombustibleGearhulk -SVar:CombustDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SpellDescription$ Controller draws a card -SVar:CombustDamage:DB$ Mill | Defined$ You | NumCards$ X | RememberMilled$ True | SubAbility$ DamageOpponent | SpellDescription$ Controller mills X cards, where X is the number of influence counters on CARDNAME, and that player loses life equal to the total mana value of those cards. +SVar:CombustDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SpellDescription$ CARDNAME's controller draws a card. +SVar:CombustDamage:DB$ Mill | Defined$ You | NumCards$ X | RememberMilled$ True | SubAbility$ DamageOpponent | SpellDescription$ CARDNAME's controller mills X cards, where X is the number of influence counters on it, and you lose life equal to the total mana value of those cards. SVar:DamageOpponent:DB$ LoseLife | Defined$ ParentTarget | LifeAmount$ Y | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$CardCounters.INFLUENCE diff --git a/forge-gui/res/cardsfolder/u/urza_assembles_the_titans.txt b/forge-gui/res/cardsfolder/u/urza_assembles_the_titans.txt index e86c955f3f1..a322f29013c 100644 --- a/forge-gui/res/cardsfolder/u/urza_assembles_the_titans.txt +++ b/forge-gui/res/cardsfolder/u/urza_assembles_the_titans.txt @@ -3,8 +3,9 @@ ManaCost:3 W W Types:Enchantment Saga K:Read ahead K:Chapter:3:DBScry,DBChangeZone,DBLoyalty -SVar:DBScry:DB$ Scry | ScryNum$ 4 | SubAbility$ DBDig | SpellAbility$ Scry 4, then you may reveal the top card of your library. If a planeswalker card is revealed this way, put it into your hand. -SVar:DBDig:DB$ Dig | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Planeswalker | LibraryPosition2$ 0 +SVar:DBScry:DB$ Scry | ScryNum$ 4 | SubAbility$ DBDig | SpellDescription$ Scry 4, then you may reveal the top card of your library. If a planeswalker card is revealed this way, put it into your hand. +SVar:DBDig:DB$ Dig | DigNum$ 1 | RevealOptional$ True | RememberRevealed$ True | ChangeNum$ All | ChangeValid$ Planeswalker.IsRemembered | LibraryPosition2$ 0 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Planeswalker.cmcLE6 | ChangeNum$ 1 | SpellDescription$ You may put a planeswalker card with mana value 6 or less from your hand onto the battlefield. SVar:DBLoyalty:DB$ Effect | StaticAbilities$ PWTwice | SpellDescription$ You may activate the loyalty abilities of planeswalkers you control twice this turn rather than only once. SVar:PWTwice:Mode$ NumLoyaltyAct | ValidCard$ Planeswalker.YouCtrl | Twice$ True | Description$ You may activate the loyalty abilities of planeswalkers you control twice this turn rather than only once. From 11a7f7b2719b109a995cb54bdeba8af378101429 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Fri, 20 Sep 2024 18:29:27 +0200 Subject: [PATCH 27/37] Script cleanup (#6180) Co-authored-by: tool4EvEr --- .../forge/game/ability/effects/DigEffect.java | 491 +++++++++--------- .../game/ability/effects/MillEffect.java | 7 +- .../game/ability/effects/ScryEffect.java | 3 +- .../res/cardsfolder/b/blacksnag_buzzard.txt | 2 +- forge-gui/res/cardsfolder/b/bulette.txt | 2 +- .../e/emissary_of_the_sleepless.txt | 2 +- .../res/cardsfolder/f/fungal_rebirth.txt | 2 +- .../res/cardsfolder/f/funnel_web_recluse.txt | 2 +- .../res/cardsfolder/g/gruesome_discovery.txt | 2 +- .../cardsfolder/h/hollowhenge_scavenger.txt | 2 +- .../cardsfolder/h/hurkyl_master_wizard.txt | 2 +- .../cardsfolder/m/malicious_affliction.txt | 2 +- .../res/cardsfolder/m/morkrut_banshee.txt | 2 +- .../res/cardsfolder/m/muster_the_departed.txt | 2 +- .../res/cardsfolder/o/old_flitterfang.txt | 2 +- .../res/cardsfolder/p/phyrexian_portal.txt | 2 +- .../cardsfolder/q/quest_for_ulas_temple.txt | 5 +- .../cardsfolder/r/reaper_from_the_abyss.txt | 2 +- forge-gui/res/cardsfolder/r/rictus_robber.txt | 2 +- .../res/cardsfolder/s/sabertooth_mauler.txt | 2 +- .../cardsfolder/s/skirsdag_high_priest.txt | 2 +- .../res/cardsfolder/t/thunderous_debut.txt | 2 +- .../res/cardsfolder/u/ulvenwald_bear.txt | 2 +- .../res/cardsfolder/v/vengeful_devil.txt | 2 +- forge-gui/res/cardsfolder/w/wakedancer.txt | 2 +- .../res/cardsfolder/w/woodland_sleuth.txt | 2 +- forge-gui/res/cardsfolder/z/zombie_ogre.txt | 2 +- 27 files changed, 268 insertions(+), 284 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index ff3f9058e44..e02678d9cc8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -40,7 +40,7 @@ public class DigEffect extends SpellAbilityEffect { String verb = " looks at "; if (sa.hasParam("DestinationZone") && sa.getParam("DestinationZone").equals("Exile") && - numToDig == numToChange) { + numToDig == numToChange) { verb = " exiles "; } else if (sa.hasParam("Reveal") && sa.getParam("Reveal").equals("True")) { verb = " reveals "; @@ -79,7 +79,7 @@ public class DigEffect extends SpellAbilityEffect { sb.append(" They ").append(sa.hasParam("Optional") ? "may " : "").append(verb2); if (sa.hasParam("ChangeValid")) { String what = sa.hasParam("ChangeValidDesc") ? sa.getParam("ChangeValidDesc") : - sa.getParam("ChangeValid"); + sa.getParam("ChangeValid"); if (!StringUtils.containsIgnoreCase(what, "card")) { what = what + " card"; } @@ -90,7 +90,7 @@ public class DigEffect extends SpellAbilityEffect { sb.append(sa.hasParam("ExileFaceDown") ? "face down " : ""); if (sa.hasParam("WithCounters") || sa.hasParam("ExileWithCounters")) { String ctr = sa.hasParam("WithCounters") ? sa.getParam("WithCounters") : - sa.getParam("ExileWithCounters"); + sa.getParam("ExileWithCounters"); sb.append("with a "); sb.append(CounterType.getType(ctr).getName().toLowerCase()); sb.append(" counter on it. They "); @@ -125,7 +125,6 @@ public class DigEffect extends SpellAbilityEffect { final boolean anyNumber = sa.hasParam("AnyNumber"); final boolean optional = sa.hasParam("Optional"); - final boolean noMove = sa.hasParam("NoMove"); final boolean skipReorder = sa.hasParam("SkipReorder"); // A hack for cards like Explorer's Scope that need to ensure that a card is revealed to the player activating the ability @@ -188,37 +187,20 @@ public class DigEffect extends SpellAbilityEffect { DelayedReveal delayedReveal = null; boolean hasRevealed = true; if (sa.hasParam("Reveal") && "True".equalsIgnoreCase(sa.getParam("Reveal"))) { - game.getAction().reveal(top, p, false); + game.getAction().reveal(top, p, false); } else if (sa.hasParam("RevealOptional")) { - String question = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblReveal") + ":", TextUtil.addSuffix(Lang.joinHomogenous(top),"?")); - - hasRevealed = p.getController().confirmAction(sa, null, question, null); + hasRevealed = p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblRevealCardToOtherPlayers"), null); if (hasRevealed) { game.getAction().reveal(top, p); } } - else if (sa.hasParam("RevealValid")) { - final String revealValid = sa.getParam("RevealValid"); - final CardCollection toReveal = CardLists.getValidCards(top, revealValid, cont, host, sa); - if (!toReveal.isEmpty()) { - game.getAction().reveal(toReveal, cont); - if (sa.hasParam("RememberRevealed")) { - host.addRemembered(toReveal); - } - } - } else if (!sa.hasParam("NoLooking")) { // show the user the revealed cards delayedReveal = new DelayedReveal(top, srcZone, PlayerView.get(p), CardTranslation.getTranslatedName(host.getName()) + " - " + Localizer.getInstance().getMessage("lblLookingCardIn") + " "); - - if (noMove) { - // Let the activating player see the cards even if they're not moved - game.getAction().revealTo(top, activator); - } } - if (sa.hasParam("RememberRevealed") && !sa.hasParam("RevealValid") && hasRevealed) { + if (sa.hasParam("RememberRevealed") && hasRevealed) { host.addRemembered(top); } if (sa.hasParam("ImprintRevealed") && hasRevealed) { @@ -233,270 +215,269 @@ public class DigEffect extends SpellAbilityEffect { host.setChosenPlayer(chooser); } } - if (!noMove) { - CardCollection movedCards; - rest.addAll(top); - CardCollection valid; - if (!changeValid.isEmpty()) { - if (changeValid.contains("ChosenType")) { - changeValid = changeValid.replace("ChosenType", host.getChosenType()); - } - valid = CardLists.getValidCards(top, changeValid, cont, host, sa); - if (totalCMC) { - valid = CardLists.getValidCards(valid, "Card.cmcLE" + totcmc, cont, host, sa); - } - } else if (totalCMC) { - valid = CardLists.getValidCards(top, "Card.cmcLE" + totcmc, cont, host, sa); - } else { - // If all the cards are valid choices, no need for a separate reveal dialog to the chooser. pfps?? - if (p == chooser && destZone1ChangeNum > 1) { - delayedReveal = null; - } - valid = top; - } - if (forceRevealToController) { - // Force revealing the card to the player activating the ability (e.g. Explorer's Scope) - game.getAction().revealTo(top, activator); - delayedReveal = null; // top is already seen by the player, do not reveal twice + CardCollection movedCards; + rest.addAll(top); + CardCollection valid; + if (!changeValid.isEmpty()) { + if (changeValid.contains("ChosenType")) { + changeValid = changeValid.replace("ChosenType", host.getChosenType()); } - - // Optional abilities that use a dialog box to prompt the user to skip the ability (e.g. Explorer's Scope, Quest for Ula's Temple) - if (optional && mayBeSkipped && !valid.isEmpty()) { - String prompt = optionalAbilityPrompt != null ? optionalAbilityPrompt : Localizer.getInstance().getMessage("lblWouldYouLikeProceedWithOptionalAbility") + " " + host + "?\n\n(" + sa.getDescription() + ")"; - if (!p.getController().confirmAction(sa, null, TextUtil.fastReplace(prompt, "CARDNAME", CardTranslation.getTranslatedName(host.getName())), null)) { - return; - } + valid = CardLists.getValidCards(top, changeValid, cont, host, sa); + if (totalCMC) { + valid = CardLists.getValidCards(valid, "Card.cmcLE" + totcmc, cont, host, sa); } + } else if (totalCMC) { + valid = CardLists.getValidCards(top, "Card.cmcLE" + totcmc, cont, host, sa); + } else { + // If all the cards are valid choices, no need for a separate reveal dialog to the chooser. pfps?? + if (p == chooser && destZone1ChangeNum > 1) { + delayedReveal = null; + } + valid = top; + } - if (changeAll) { - movedCards = new CardCollection(valid); - } else if (sa.hasParam("RandomChange")) { - int numChanging = Math.min(destZone1ChangeNum, valid.size()); - movedCards = CardLists.getRandomSubList(valid, numChanging); - } else if (totalCMC) { - movedCards = new CardCollection(); - if (p == chooser) { - chooser.getController().tempShowCards(top); + if (forceRevealToController) { + // Force revealing the card to the player activating the ability (e.g. Explorer's Scope) + game.getAction().revealTo(top, activator); + delayedReveal = null; // top is already seen by the player, do not reveal twice + } + + // Optional abilities that use a dialog box to prompt the user to skip the ability (e.g. Explorer's Scope, Quest for Ula's Temple) + if (optional && mayBeSkipped && !valid.isEmpty()) { + String prompt = optionalAbilityPrompt != null ? optionalAbilityPrompt : Localizer.getInstance().getMessage("lblWouldYouLikeProceedWithOptionalAbility") + " " + host + "?\n\n(" + sa.getDescription() + ")"; + if (!p.getController().confirmAction(sa, null, TextUtil.fastReplace(prompt, "CARDNAME", CardTranslation.getTranslatedName(host.getName())), null)) { + return; + } + } + + if (changeAll) { + movedCards = new CardCollection(valid); + } else if (sa.hasParam("RandomChange")) { + int numChanging = Math.min(destZone1ChangeNum, valid.size()); + movedCards = CardLists.getRandomSubList(valid, numChanging); + } else if (totalCMC) { + movedCards = new CardCollection(); + if (p == chooser) { + chooser.getController().tempShowCards(top); + } + if (valid.isEmpty()) { + chooser.getController().notifyOfValue(sa, null, + Localizer.getInstance().getMessage("lblNoValidCards")); + } + while (!valid.isEmpty() && (anyNumber || movedCards.size() < destZone1ChangeNum)) { + Card chosen = chooser.getController().chooseSingleEntityForEffect(valid, delayedReveal, sa, + Localizer.getInstance().getMessage("lblChooseOne"), anyNumber || optional, p, null); + if (chosen == null) { + //if they can and did choose nothing, we're done here + break; } - if (valid.isEmpty()) { - chooser.getController().notifyOfValue(sa, null, - Localizer.getInstance().getMessage("lblNoValidCards")); - } - while (!valid.isEmpty() && (anyNumber || movedCards.size() < destZone1ChangeNum)) { - Card chosen = chooser.getController().chooseSingleEntityForEffect(valid, delayedReveal, sa, - Localizer.getInstance().getMessage("lblChooseOne"), anyNumber || optional, p, null); - if (chosen == null) { - //if they can and did choose nothing, we're done here - break; - } + movedCards.add(chosen); + valid.remove(chosen); + totcmc = totcmc - chosen.getCMC(); + valid = CardLists.getValidCards(valid, "Card.cmcLE" + totcmc, cont, host, sa); + } + chooser.getController().endTempShowCards(); + if (!movedCards.isEmpty()) { + game.getAction().reveal(movedCards, chooser, true, + Localizer.getInstance().getMessage("lblPlayerPickedChosen", + chooser.getName(), "")); + } + } else if (sa.hasParam("ForEachColorPair")) { + movedCards = new CardCollection(); + if (p == chooser) { + chooser.getController().tempShowCards(top); + } + for (final byte pair : MagicColor.COLORPAIR) { + Card chosen = chooser.getController().chooseSingleEntityForEffect(CardLists.filter(valid, + CardPredicates.isExactlyColor(pair)), delayedReveal, sa, + Localizer.getInstance().getMessage("lblChooseOne"), false, p, null); + if (chosen != null) { movedCards.add(chosen); - valid.remove(chosen); - totcmc = totcmc - chosen.getCMC(); - valid = CardLists.getValidCards(valid, "Card.cmcLE" + totcmc, cont, host, sa); } - chooser.getController().endTempShowCards(); - if (!movedCards.isEmpty()) { - game.getAction().reveal(movedCards, chooser, true, - Localizer.getInstance().getMessage("lblPlayerPickedChosen", - chooser.getName(), "")); + } + chooser.getController().endTempShowCards(); + if (!movedCards.isEmpty()) { + game.getAction().reveal(movedCards, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedChosen", chooser.getName(), "")); + } + } else { + String prompt; + + if (sa.hasParam("PrimaryPrompt")) { + prompt = sa.getParam("PrimaryPrompt"); + } else { + prompt = Localizer.getInstance().getMessage("lblChooseCardsPutIntoZone", destZone1.getTranslatedName()); + if (destZone1.equals(ZoneType.Library)) { + if (!destZone2.equals(ZoneType.Library) && destZone1ChangeNum == 1) { + if (libraryPosition == 0) { + prompt = Localizer.getInstance().getMessage("lblChooseACardToLeaveTargetLibraryTop", p.getName()); + } else { + prompt = Localizer.getInstance().getMessage("lblChooseACardLeaveTarget", p.getName(), destZone1.getTranslatedName()); + } + } else if (libraryPosition == -1) { + prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibraryBottom", p.getName()); + } else if (libraryPosition == 0) { + prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibraryTop", p.getName()); + } } - } else if (sa.hasParam("ForEachColorPair")) { - movedCards = new CardCollection(); - if (p == chooser) { + } + + movedCards = new CardCollection(); + if (valid.isEmpty()) { + chooser.getController().notifyOfValue(sa, null, Localizer.getInstance().getMessage("lblNoValidCards")); + } else { + if (p == chooser) { // the digger can still see all the dug cards when choosing chooser.getController().tempShowCards(top); } - for (final byte pair : MagicColor.COLORPAIR) { - Card chosen = chooser.getController().chooseSingleEntityForEffect(CardLists.filter(valid, - CardPredicates.isExactlyColor(pair)), delayedReveal, sa, - Localizer.getInstance().getMessage("lblChooseOne"), false, p, null); - if (chosen != null) { - movedCards.add(chosen); - } + + int max = anyNumber ? valid.size() : Math.min(valid.size(), destZone1ChangeNum); + int min = (anyNumber || optional) ? 0 : max; + if (max > 0) { // if max is 0 don't make a choice + movedCards.addAll(chooser.getController().chooseEntitiesForEffect(valid, min, max, delayedReveal, sa, prompt, p, null)); } + chooser.getController().endTempShowCards(); - if (!movedCards.isEmpty()) { - game.getAction().reveal(movedCards, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedChosen", chooser.getName(), "")); - } + } + + if (!changeValid.isEmpty() && !sa.hasParam("ExileFaceDown") && !sa.hasParam("NoReveal")) { + game.getAction().reveal(movedCards, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedCardFrom", chooser.getName())); + } + } + if (sa.hasParam("ForgetOtherRemembered")) { + host.clearRemembered(); + } + Collections.reverse(movedCards); + + if (destZone1.equals(ZoneType.Battlefield) || destZone1.equals(ZoneType.Library)) { + if (sa.hasParam("GainControl")) { + // for Cybership + movedCards = (CardCollection) activator.getController().orderMoveToZoneList(rest, destZone2, sa); } else { - String prompt; + movedCards = (CardCollection) GameActionUtil.orderCardsByTheirOwners(game, movedCards, destZone1, sa); + } + } - if (sa.hasParam("PrimaryPrompt")) { - prompt = sa.getParam("PrimaryPrompt"); - } else { - prompt = Localizer.getInstance().getMessage("lblChooseCardsPutIntoZone", destZone1.getTranslatedName()); - if (destZone1.equals(ZoneType.Library)) { - if (!destZone2.equals(ZoneType.Library) && destZone1ChangeNum == 1) { - if (libraryPosition == 0) { - prompt = Localizer.getInstance().getMessage("lblChooseACardToLeaveTargetLibraryTop", p.getName()); - } else { - prompt = Localizer.getInstance().getMessage("lblChooseACardLeaveTarget", p.getName(), destZone1.getTranslatedName()); - } - } else if (libraryPosition == -1) { - prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibraryBottom", p.getName()); - } else if (libraryPosition == 0) { - prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibraryTop", p.getName()); - } - } + + for (Card c : movedCards) { + Map moveParams = AbilityKey.newMap(); + AbilityKey.addCardZoneTableParams(moveParams, zoneMovements); + + if (destZone1.equals(ZoneType.Library) || destZone1.equals(ZoneType.PlanarDeck) || destZone1.equals(ZoneType.SchemeDeck)) { + c = game.getAction().moveTo(destZone1, c, libraryPosition, sa, AbilityKey.newMap()); + } else { + if (destZone1.equals(ZoneType.Exile) && !c.canExiledBy(sa, true)) { + continue; } - movedCards = new CardCollection(); - if (valid.isEmpty()) { - chooser.getController().notifyOfValue(sa, null, Localizer.getInstance().getMessage("lblNoValidCards")); - } else { - if (p == chooser) { // the digger can still see all the dug cards when choosing - chooser.getController().tempShowCards(top); - } - - int max = anyNumber ? valid.size() : Math.min(valid.size(), destZone1ChangeNum); - int min = (anyNumber || optional) ? 0 : max; - if (max > 0) { // if max is 0 don't make a choice - movedCards.addAll(chooser.getController().chooseEntitiesForEffect(valid, min, max, delayedReveal, sa, prompt, p, null)); - } - - chooser.getController().endTempShowCards(); + if (sa.hasParam("Tapped")) { + c.setTapped(true); } - - if (!changeValid.isEmpty() && !sa.hasParam("ExileFaceDown") && !sa.hasParam("NoReveal")) { - game.getAction().reveal(movedCards, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedCardFrom", chooser.getName())); + if (sa.hasParam("FaceDown")) { + c.turnFaceDown(true); + CardFactoryUtil.setFaceDownState(c, sa); } + if (destZone1.equals(ZoneType.Battlefield)) { + moveParams.put(AbilityKey.SimultaneousETB, movedCards); + if (sa.hasParam("GainControl")) { + c.setController(activator, game.getNextTimestamp()); + } + if (sa.hasParam("WithCounters")) { + final int numCtr = AbilityUtils.calculateAmount(host, + sa.getParamOrDefault("WithCountersAmount", "1"), sa); + + GameEntityCounterTable table = new GameEntityCounterTable(); + table.put(activator, c, CounterType.getType(sa.getParam("WithCounters")), numCtr); + moveParams.put(AbilityKey.CounterTable, table); + } + } + if (sa.hasAdditionalAbility("AnimateSubAbility")) { + // need LKI before Animate does apply + moveParams.put(AbilityKey.CardLKI, CardCopyService.getLKICopy(c)); + + final SpellAbility animate = sa.getAdditionalAbility("AnimateSubAbility"); + host.addRemembered(c); + AbilityUtils.resolve(animate); + host.removeRemembered(c); + animate.setSVar("unanimateTimestamp", String.valueOf(game.getTimestamp())); + } + c = game.getAction().moveTo(c.getController().getZone(destZone1), c, sa, moveParams); + if (destZone1.equals(ZoneType.Battlefield)) { + if (addToCombat(c, sa, "Attacking", "Blocking")) { + combatChanged = true; + } + } else if (destZone1.equals(ZoneType.Exile)) { + if (sa.hasParam("ExileWithCounters")) { + c.addCounter(CounterType.getType(sa.getParam("ExileWithCounters")), 1, activator, counterTable); + } + handleExiledWith(c, sa); + } + } + + if (sa.hasParam("ExileFaceDown")) { + c.turnFaceDown(true); + } + if (sa.hasParam("WithMayLook")) { + c.addMayLookFaceDownExile(activator); + } + if (sa.hasParam("Imprint")) { + host.addImprintedCard(c); } if (sa.hasParam("ForgetOtherRemembered")) { host.clearRemembered(); } - Collections.reverse(movedCards); - - if (destZone1.equals(ZoneType.Battlefield) || destZone1.equals(ZoneType.Library)) { - if (sa.hasParam("GainControl")) { - // for Cybership - movedCards = (CardCollection) activator.getController().orderMoveToZoneList(rest, destZone2, sa); - } else { - movedCards = (CardCollection) GameActionUtil.orderCardsByTheirOwners(game, movedCards, destZone1, sa); - } + if (remZone1) { + host.addRemembered(c); } + rest.remove(c); + } + // now, move the rest to destZone2 + if (!rest.isEmpty() && (!sa.hasParam("DestZone2Optional") || p.getController().confirmAction(sa, null, + Localizer.getInstance().getMessage("lblDoYouWantPutCardToZone", + destZone2.getTranslatedName()), null))) { + if (destZone2 == ZoneType.Library || destZone2 == ZoneType.PlanarDeck + || destZone2 == ZoneType.SchemeDeck || destZone2 == ZoneType.Graveyard) { + CardCollection afterOrder = rest; + if (sa.hasParam("RestRandomOrder")) { + CardLists.shuffle(afterOrder); + } else if (!skipReorder && rest.size() > 1) { + if (destZone2 == ZoneType.Graveyard) { + afterOrder = (CardCollection) GameActionUtil.orderCardsByTheirOwners(game, rest, destZone2, sa); + } else { + afterOrder = (CardCollection) chooser.getController().orderMoveToZoneList(rest, destZone2, sa); + } + } + if (libraryPosition2 != -1) { + // Closest to top + Collections.reverse(afterOrder); + } - for (Card c : movedCards) { - Map moveParams = AbilityKey.newMap(); - AbilityKey.addCardZoneTableParams(moveParams, zoneMovements); + for (final Card c : afterOrder) { + Map moveParams = AbilityKey.newMap(); + AbilityKey.addCardZoneTableParams(moveParams, zoneMovements); - if (destZone1.equals(ZoneType.Library) || destZone1.equals(ZoneType.PlanarDeck) || destZone1.equals(ZoneType.SchemeDeck)) { - c = game.getAction().moveTo(destZone1, c, libraryPosition, sa, AbilityKey.newMap()); - } else { - if (destZone1.equals(ZoneType.Exile) && !c.canExiledBy(sa, true)) { + Card m = game.getAction().moveTo(destZone2, c, libraryPosition2, sa, moveParams); + if (remZone2) { + host.addRemembered(m); + } + } + } else { + // just move them randomly + for (Card c : rest) { + Map moveParams = AbilityKey.newMap(); + AbilityKey.addCardZoneTableParams(moveParams, zoneMovements); + + if (destZone2 == ZoneType.Exile && !c.canExiledBy(sa, true)) { continue; } - - if (sa.hasParam("Tapped")) { - c.setTapped(true); - } - if (sa.hasParam("FaceDown")) { - c.turnFaceDown(true); - CardFactoryUtil.setFaceDownState(c, sa); - } - if (destZone1.equals(ZoneType.Battlefield)) { - moveParams.put(AbilityKey.SimultaneousETB, movedCards); - if (sa.hasParam("GainControl")) { - c.setController(activator, game.getNextTimestamp()); - } - if (sa.hasParam("WithCounters")) { - final int numCtr = AbilityUtils.calculateAmount(host, - sa.getParamOrDefault("WithCountersAmount", "1"), sa); - - GameEntityCounterTable table = new GameEntityCounterTable(); - table.put(activator, c, CounterType.getType(sa.getParam("WithCounters")), numCtr); - moveParams.put(AbilityKey.CounterTable, table); - } - } - if (sa.hasAdditionalAbility("AnimateSubAbility")) { - // need LKI before Animate does apply - moveParams.put(AbilityKey.CardLKI, CardCopyService.getLKICopy(c)); - - final SpellAbility animate = sa.getAdditionalAbility("AnimateSubAbility"); - host.addRemembered(c); - AbilityUtils.resolve(animate); - host.removeRemembered(c); - animate.setSVar("unanimateTimestamp", String.valueOf(game.getTimestamp())); - } - c = game.getAction().moveTo(c.getController().getZone(destZone1), c, sa, moveParams); - if (destZone1.equals(ZoneType.Battlefield)) { - if (addToCombat(c, sa, "Attacking", "Blocking")) { - combatChanged = true; - } - } else if (destZone1.equals(ZoneType.Exile)) { + c = game.getAction().moveTo(destZone2, c, sa, moveParams); + if (destZone2 == ZoneType.Exile) { if (sa.hasParam("ExileWithCounters")) { c.addCounter(CounterType.getType(sa.getParam("ExileWithCounters")), 1, activator, counterTable); } handleExiledWith(c, sa); - } - } - - if (sa.hasParam("ExileFaceDown")) { - c.turnFaceDown(true); - } - if (sa.hasParam("WithMayLook")) { - c.addMayLookFaceDownExile(activator); - } - if (sa.hasParam("Imprint")) { - host.addImprintedCard(c); - } - if (sa.hasParam("ForgetOtherRemembered")) { - host.clearRemembered(); - } - if (remZone1) { - host.addRemembered(c); - } - rest.remove(c); - } - - // now, move the rest to destZone2 - if (!rest.isEmpty() && (!sa.hasParam("DestZone2Optional") || p.getController().confirmAction(sa, null, - Localizer.getInstance().getMessage("lblDoYouWantPutCardToZone", - destZone2.getTranslatedName()), null))) { - if (destZone2 == ZoneType.Library || destZone2 == ZoneType.PlanarDeck - || destZone2 == ZoneType.SchemeDeck || destZone2 == ZoneType.Graveyard) { - CardCollection afterOrder = rest; - if (sa.hasParam("RestRandomOrder")) { - CardLists.shuffle(afterOrder); - } else if (!skipReorder && rest.size() > 1) { - if (destZone2 == ZoneType.Graveyard) { - afterOrder = (CardCollection) GameActionUtil.orderCardsByTheirOwners(game, rest, destZone2, sa); - } else { - afterOrder = (CardCollection) chooser.getController().orderMoveToZoneList(rest, destZone2, sa); - } - } - if (libraryPosition2 != -1) { - // Closest to top - Collections.reverse(afterOrder); - } - - for (final Card c : afterOrder) { - Map moveParams = AbilityKey.newMap(); - AbilityKey.addCardZoneTableParams(moveParams, zoneMovements); - - Card m = game.getAction().moveTo(destZone2, c, libraryPosition2, sa, moveParams); if (remZone2) { - host.addRemembered(m); - } - } - } else { - // just move them randomly - for (Card c : rest) { - Map moveParams = AbilityKey.newMap(); - AbilityKey.addCardZoneTableParams(moveParams, zoneMovements); - - if (destZone2 == ZoneType.Exile && !c.canExiledBy(sa, true)) { - continue; - } - c = game.getAction().moveTo(destZone2, c, sa, moveParams); - if (destZone2 == ZoneType.Exile) { - if (sa.hasParam("ExileWithCounters")) { - c.addCounter(CounterType.getType(sa.getParam("ExileWithCounters")), 1, activator, counterTable); - } - handleExiledWith(c, sa); - if (remZone2) { - host.addRemembered(c); - } + host.addRemembered(c); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java index 2ecc0e4d2f7..69ada036b28 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java @@ -18,11 +18,16 @@ import forge.util.TextUtil; import java.util.Map; public class MillEffect extends SpellAbilityEffect { + @Override public void resolve(SpellAbility sa) { final Card source = sa.getHostCard(); final Game game = source.getGame(); - final int numCards = sa.hasParam("NumCards") ? AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumCards"), sa) : 1; + final int numCards = sa.hasParam("NumCards") ? AbilityUtils.calculateAmount(source, sa.getParam("NumCards"), sa) : 1; + + if (numCards <= 0) { + return; + } if (sa.hasParam("ForgetOtherRemembered")) { source.clearRemembered(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java index a2719abc4f3..2907d82480f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java @@ -17,8 +17,7 @@ public class ScryEffect extends SpellAbilityEffect { protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); - final List players = Lists.newArrayList(); // players really affected - players.addAll(getTargetPlayers(sa)); + final List players = getTargetPlayers(sa); sb.append(Lang.joinHomogenous(players)).append(" "); int num = 1; diff --git a/forge-gui/res/cardsfolder/b/blacksnag_buzzard.txt b/forge-gui/res/cardsfolder/b/blacksnag_buzzard.txt index 0c147089605..43c77c07d8b 100644 --- a/forge-gui/res/cardsfolder/b/blacksnag_buzzard.txt +++ b/forge-gui/res/cardsfolder/b/blacksnag_buzzard.txt @@ -4,7 +4,7 @@ Types:Creature Bird PT:2/1 K:Flying K:etbCounter:P1P1:1:CheckSVar$ Morbid:CARDNAME enters with a +1/+1 counter on it if a creature died this turn. -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 K:Plot:1 B DeckHas:Ability$Counters Oracle:Flying\nBlacksnag Buzzard enters with a +1/+1 counter on it if a creature died this turn.\nPlot {1}{B} (You may pay {1}{B} and exile this card from your hand. Cast it as a sorcery on a later turn without paying its mana cost. Plot only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/b/bulette.txt b/forge-gui/res/cardsfolder/b/bulette.txt index a3bc4b200fd..12fa53efdb7 100644 --- a/forge-gui/res/cardsfolder/b/bulette.txt +++ b/forge-gui/res/cardsfolder/b/bulette.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:3/3 T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, if a creature died this turn, put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 DeckHas:Ability$Counters Oracle:At the beginning of your end step, if a creature died this turn, put a +1/+1 counter on Bulette. diff --git a/forge-gui/res/cardsfolder/e/emissary_of_the_sleepless.txt b/forge-gui/res/cardsfolder/e/emissary_of_the_sleepless.txt index ccf2d7213c8..a5879291495 100644 --- a/forge-gui/res/cardsfolder/e/emissary_of_the_sleepless.txt +++ b/forge-gui/res/cardsfolder/e/emissary_of_the_sleepless.txt @@ -5,6 +5,6 @@ PT:2/4 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters, if a creature died this turn, create a 1/1 white Spirit creature token with flying. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_spirit_flying | TokenOwner$ You -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 DeckHas:Ability$Token Oracle:Flying\nWhen Emissary of the Sleepless enters, if a creature died this turn, create a 1/1 white Spirit creature token with flying. diff --git a/forge-gui/res/cardsfolder/f/fungal_rebirth.txt b/forge-gui/res/cardsfolder/f/fungal_rebirth.txt index 12fe803a9dc..9fdb792f16f 100644 --- a/forge-gui/res/cardsfolder/f/fungal_rebirth.txt +++ b/forge-gui/res/cardsfolder/f/fungal_rebirth.txt @@ -3,7 +3,7 @@ ManaCost:2 G Types:Instant A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target permanent card in your graveyard | ValidTgts$ Permanent.YouOwn | SubAbility$ DBToken | StackDescription$ SpellDescription | SpellDescription$ Return target permanent card from your graveyard to your hand. If a creature died this turn, create two 1/1 green Saproling creature tokens. SVar:DBToken:DB$ Token | TokenAmount$ 2 | TokenScript$ g_1_1_saproling | TokenOwner$ You | ConditionCheckSVar$ Morbid | ConditionSVarCompare$ GE1 -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 DeckHints:Type$Fungus DeckHas:Ability$Token Oracle:Return target permanent card from your graveyard to your hand. If a creature died this turn, create two 1/1 green Saproling creature tokens. diff --git a/forge-gui/res/cardsfolder/f/funnel_web_recluse.txt b/forge-gui/res/cardsfolder/f/funnel_web_recluse.txt index 9bc5a201bb8..2b77b739cf2 100644 --- a/forge-gui/res/cardsfolder/f/funnel_web_recluse.txt +++ b/forge-gui/res/cardsfolder/f/funnel_web_recluse.txt @@ -5,6 +5,6 @@ PT:3/5 K:Reach T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ TrigInvestigate | TriggerDescription$ Morbid — When CARDNAME enters, if a creature died this turn, investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.") SVar:TrigInvestigate:DB$ Investigate -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 DeckHas:Ability$Investigate|Token Oracle:Reach\nMorbid — When Funnel-Web Recluse enters, if a creature died this turn, investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.") diff --git a/forge-gui/res/cardsfolder/g/gruesome_discovery.txt b/forge-gui/res/cardsfolder/g/gruesome_discovery.txt index 9676fe11f5a..05c9c64f309 100644 --- a/forge-gui/res/cardsfolder/g/gruesome_discovery.txt +++ b/forge-gui/res/cardsfolder/g/gruesome_discovery.txt @@ -3,5 +3,5 @@ ManaCost:2 B B Types:Sorcery A:SP$ Discard | ValidTgts$ Player | Mode$ TgtChoose | NumCards$ 2 | ConditionCheckSVar$ Morbid | ConditionSVarCompare$ EQ0 | SubAbility$ MorbidDiscard | SpellDescription$ Target player discards two cards. SVar:MorbidDiscard:DB$ Discard | Defined$ Targeted | Mode$ RevealYouChoose | NumCards$ 2 | ConditionCheckSVar$ Morbid | ConditionSVarCompare$ GE1 | SpellDescription$ Morbid — If a creature died this turn, instead that player reveals their hand, you choose two cards from it, then that player discards those cards. -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 Oracle:Target player discards two cards.\nMorbid — If a creature died this turn, instead that player reveals their hand, you choose two cards from it, then that player discards those cards. diff --git a/forge-gui/res/cardsfolder/h/hollowhenge_scavenger.txt b/forge-gui/res/cardsfolder/h/hollowhenge_scavenger.txt index 63412c24850..0b1b043e9c8 100644 --- a/forge-gui/res/cardsfolder/h/hollowhenge_scavenger.txt +++ b/forge-gui/res/cardsfolder/h/hollowhenge_scavenger.txt @@ -4,5 +4,5 @@ Types:Creature Elemental PT:4/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ TrigGainLife | TriggerDescription$ Morbid — When CARDNAME enters, if a creature died this turn, you gain 5 life. SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 5 -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 Oracle:Morbid — When Hollowhenge Scavenger enters, if a creature died this turn, you gain 5 life. diff --git a/forge-gui/res/cardsfolder/h/hurkyl_master_wizard.txt b/forge-gui/res/cardsfolder/h/hurkyl_master_wizard.txt index 25e9723c4bd..82e0222b43d 100644 --- a/forge-gui/res/cardsfolder/h/hurkyl_master_wizard.txt +++ b/forge-gui/res/cardsfolder/h/hurkyl_master_wizard.txt @@ -3,7 +3,7 @@ ManaCost:1 U U Types:Legendary Creature Human Wizard Advisor PT:2/4 T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigDig | TriggerDescription$ At the beginning of your end step, if you've cast a noncreature spell this turn, reveal the top five cards of your library. For each card type among noncreature spells you've cast this turn, you may put a card of that type from among the revealed cards into your hand. Put the rest on the bottom of your library in a random order. -SVar:TrigDig:DB$ Dig | DigNum$ 5 | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBRepeatEach +SVar:TrigDig:DB$ PeekAndReveal | PeekAmount$ 5 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBRepeatEach SVar:DBRepeatEach:DB$ RepeatEach | RepeatTypesFrom$ ThisTurnCast_Card.nonCreature+YouCtrl+sharesCardTypeWith Remembered | RepeatSubAbility$ ChooseCard | SubAbility$ DBChangeZoneAll SVar:ChooseCard:DB$ ChooseCard | Choices$ Card.IsRemembered+ChosenType | ImprintChosen$ True | ForgetChosen$ True | ChoiceTitle$ You may choose a card of this type to put into your hand | ChoiceTitleAppend$ ChosenType | ChoiceZone$ Library SVar:DBChangeZoneAll:DB$ ChangeZone | Defined$ Imprinted | Origin$ Library | Destination$ Hand | SubAbility$ DBRestRandomOrder diff --git a/forge-gui/res/cardsfolder/m/malicious_affliction.txt b/forge-gui/res/cardsfolder/m/malicious_affliction.txt index 824d3a67a0e..e9f60a6f876 100644 --- a/forge-gui/res/cardsfolder/m/malicious_affliction.txt +++ b/forge-gui/res/cardsfolder/m/malicious_affliction.txt @@ -4,5 +4,5 @@ Types:Instant A:SP$ Destroy | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy target nonblack creature. T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigCopy | CheckSVar$ Morbid | SVarCompare$ GE1 | OptionalDecider$ You | TriggerDescription$ Morbid — When you cast this spell, if a creature died this turn, you may copy CARDNAME and may choose a new target for the copy. SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 Oracle:Morbid — When you cast this spell, if a creature died this turn, you may copy Malicious Affliction and may choose a new target for the copy.\nDestroy target nonblack creature. diff --git a/forge-gui/res/cardsfolder/m/morkrut_banshee.txt b/forge-gui/res/cardsfolder/m/morkrut_banshee.txt index 03fb6ef3a5a..5b09e47e358 100644 --- a/forge-gui/res/cardsfolder/m/morkrut_banshee.txt +++ b/forge-gui/res/cardsfolder/m/morkrut_banshee.txt @@ -4,5 +4,5 @@ Types:Creature Spirit PT:4/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ TrigPump | TriggerDescription$ Morbid — When CARDNAME enters, if a creature died this turn, target creature gets -4/-4 until end of turn. SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | NumAtt$ -4 | NumDef$ -4 -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 Oracle:Morbid — When Morkrut Banshee enters, if a creature died this turn, target creature gets -4/-4 until end of turn. diff --git a/forge-gui/res/cardsfolder/m/muster_the_departed.txt b/forge-gui/res/cardsfolder/m/muster_the_departed.txt index 5da77cca67e..a9d62ff6652 100644 --- a/forge-gui/res/cardsfolder/m/muster_the_departed.txt +++ b/forge-gui/res/cardsfolder/m/muster_the_departed.txt @@ -5,6 +5,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_spirit_flying | TokenOwner$ You T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ DBCopy | TriggerDescription$ Morbid — At the beginning of your end step, if a creature died this turn, populate. (Create a token that's a copy of a creature token you control.) SVar:DBCopy:DB$ CopyPermanent | Choices$ Creature.token+YouCtrl | NumCopies$ 1 | Populate$ True -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 DeckHas:Ability$Token & Type$Spirit Oracle:When Muster the Departed enters, create a 1/1 white Spirit creature token with flying.\nMorbid — At the beginning of your end step, if a creature died this turn, populate. (Create a token that's a copy of a creature token you control.) diff --git a/forge-gui/res/cardsfolder/o/old_flitterfang.txt b/forge-gui/res/cardsfolder/o/old_flitterfang.txt index 6a209eeacfa..90f89b8f31e 100644 --- a/forge-gui/res/cardsfolder/o/old_flitterfang.txt +++ b/forge-gui/res/cardsfolder/o/old_flitterfang.txt @@ -5,7 +5,7 @@ PT:3/4 K:Flying T:Mode$ Phase | Phase$ End of Turn | CheckSVar$ Morbid | SVarCompare$ GE1 | TriggerZones$ Battlefield | Execute$ TrigFood | TriggerDescription$ At the beginning of each end step, if a creature died this turn, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") SVar:TrigFood:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 A:AB$ Pump | Cost$ 2 B Sac<1/Creature.Other;Artifact/another creature or artifact> | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. DeckHas:Ability$Token|Sacrifice & Type$Food|Artifact DeckHints:Ability$Sacrifice diff --git a/forge-gui/res/cardsfolder/p/phyrexian_portal.txt b/forge-gui/res/cardsfolder/p/phyrexian_portal.txt index f5bda7ff81d..e9388dbb6c6 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_portal.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_portal.txt @@ -1,7 +1,7 @@ Name:Phyrexian Portal ManaCost:3 Types:Artifact -A:AB$ Dig | Cost$ 3 | ValidTgts$ Opponent | Defined$ You | DigNum$ 10 | RememberRevealed$ True | NoLooking$ True | NoMove$ True | Choser$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10 | SubAbility$ DBTwoPiles | SpellDescription$ If your library has ten or more cards in it, target opponent looks at the top ten cards of your library and separates them into two face-down piles. Exile one of those piles. Search the other pile for a card, put it into your hand, then shuffle the rest of that pile into your library. | StackDescription$ SpellDescription +A:AB$ PeekAndReveal | Cost$ 3 | ValidTgts$ Opponent | Defined$ You | PeekAmount$ 10 | RememberPeeked$ True | NoPeek$ True | NoReveal$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10 | SubAbility$ DBTwoPiles | SpellDescription$ If your library has ten or more cards in it, target opponent looks at the top ten cards of your library and separates them into two face-down piles. Exile one of those piles. Search the other pile for a card, put it into your hand, then shuffle the rest of that pile into your library. | StackDescription$ SpellDescription SVar:DBTwoPiles:DB$ TwoPiles | Defined$ You | DefinedCards$ Remembered | Separator$ Targeted | FaceDown$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10 | ChosenPile$ DBHand | UnchosenPile$ DBExile SVar:DBHand:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | ChooseFromDefined$ Remembered | Mandatory$ True | Shuffle$ True SVar:DBExile:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Exile diff --git a/forge-gui/res/cardsfolder/q/quest_for_ulas_temple.txt b/forge-gui/res/cardsfolder/q/quest_for_ulas_temple.txt index d70d1c2752f..a8c4ea9edc4 100644 --- a/forge-gui/res/cardsfolder/q/quest_for_ulas_temple.txt +++ b/forge-gui/res/cardsfolder/q/quest_for_ulas_temple.txt @@ -1,9 +1,8 @@ Name:Quest for Ula's Temple ManaCost:U Types:Enchantment -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigDig | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may look at the top card of your library. If it's a creature card, you may reveal it and put a quest counter on Quest for CARDNAME. -SVar:TrigDig:DB$ Dig | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | SubAbility$ TrigDig2 -SVar:TrigDig2:DB$ Dig | DigNum$ 1 | ChangeNum$ All | RevealValid$ Creature | ChangeValid$ Creature | Optional$ True | PromptToSkipOptionalAbility$ True | OptionalAbilityPrompt$ Would you like to reveal the creature and put a quest counter on CARDNAME? | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | RememberChanged$ True | AILogic$ AlwaysConfirm | SubAbility$ DBPutCounter +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigPeek | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may look at the top card of your library. If it's a creature card, you may reveal it and put a quest counter on Quest for CARDNAME. +SVar:TrigPeek:DB$ PeekAndReveal | RevealValid$ Creature | RevealOptional$ True | RememberRevealed$ True | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | CounterType$ QUEST | CounterNum$ 1 | Defined$ Self | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ1 | SubAbility$ DBCleanup T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_GE3_QUEST | PresentCompare$ EQ1 | TriggerDescription$ At the beginning of each end step, if there are three or more quest counters on CARDNAME, you may put a Kraken, Leviathan, Octopus, or Serpent creature card from your hand onto the battlefield. SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.Kraken,Creature.Leviathan,Creature.Octopus,Creature.Serpent | ChangeNum$ 1 | Hidden$ True diff --git a/forge-gui/res/cardsfolder/r/reaper_from_the_abyss.txt b/forge-gui/res/cardsfolder/r/reaper_from_the_abyss.txt index a10957c7f2e..b66a574398b 100644 --- a/forge-gui/res/cardsfolder/r/reaper_from_the_abyss.txt +++ b/forge-gui/res/cardsfolder/r/reaper_from_the_abyss.txt @@ -5,5 +5,5 @@ PT:6/6 K:Flying T:Mode$ Phase | Phase$ End of Turn | CheckSVar$ Morbid | SVarCompare$ GE1 | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Morbid — At the beginning of each end step, if a creature died this turn, destroy target non-demon creature. SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.nonDemon | TgtPrompt$ Select target non-Demon creature -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 Oracle:Flying\nMorbid — At the beginning of each end step, if a creature died this turn, destroy target non-Demon creature. diff --git a/forge-gui/res/cardsfolder/r/rictus_robber.txt b/forge-gui/res/cardsfolder/r/rictus_robber.txt index a8d685499c4..c06ef3a3428 100644 --- a/forge-gui/res/cardsfolder/r/rictus_robber.txt +++ b/forge-gui/res/cardsfolder/r/rictus_robber.txt @@ -4,7 +4,7 @@ Types:Creature Zombie Rogue PT:4/3 T:Mode$ ChangesZone | Origin$ Any | CheckSVar$ Morbid | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters, if a creature died this turn, create a 2/2 blue and black Zombie Rogue creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ ub_2_2_zombie_rogue | TokenOwner$ You -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 DeckHas:Ability$Token & Type$Zombie|Rogue & Color$Blue K:Plot:2 B Oracle:When Rictus Robber enters, if a creature died this turn, create a 2/2 blue and black Zombie Rogue creature token.\nPlot {2}{B} (You may pay {2}{B} and exile this card from your hand. Cast it as a sorcery on a later turn without paying its mana cost. Plot only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/s/sabertooth_mauler.txt b/forge-gui/res/cardsfolder/s/sabertooth_mauler.txt index d35e9bc14c7..fd9860e311d 100644 --- a/forge-gui/res/cardsfolder/s/sabertooth_mauler.txt +++ b/forge-gui/res/cardsfolder/s/sabertooth_mauler.txt @@ -5,6 +5,6 @@ PT:3/3 T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, if a creature died this turn, put a +1/+1 counter on CARDNAME and untap it. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBUntap SVar:DBUntap:DB$ Untap | Defined$ Self -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 DeckHas:Ability$Counters Oracle:At the beginning of your end step, if a creature died this turn, put a +1/+1 counter on Sabertooth Mauler and untap it. diff --git a/forge-gui/res/cardsfolder/s/skirsdag_high_priest.txt b/forge-gui/res/cardsfolder/s/skirsdag_high_priest.txt index 0153630a6fc..98919d8dccf 100644 --- a/forge-gui/res/cardsfolder/s/skirsdag_high_priest.txt +++ b/forge-gui/res/cardsfolder/s/skirsdag_high_priest.txt @@ -3,5 +3,5 @@ ManaCost:1 B Types:Creature Human Cleric PT:1/2 A:AB$ Token | Cost$ T tapXType<2/Creature> | CheckSVar$ Morbid | SVarCompare$ GE1 | TokenAmount$ 1 | TokenScript$ b_5_5_demon_flying | TokenOwner$ You | CostDesc$ Morbid — {T}, Tap two untapped creatures you control: | SpellDescription$ Create a 5/5 black Demon creature token with flying. Activate only if a creature died this turn. -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 Oracle:Morbid — {T}, Tap two untapped creatures you control: Create a 5/5 black Demon creature token with flying. Activate only if a creature died this turn. diff --git a/forge-gui/res/cardsfolder/t/thunderous_debut.txt b/forge-gui/res/cardsfolder/t/thunderous_debut.txt index 649aa906a65..229eb111759 100644 --- a/forge-gui/res/cardsfolder/t/thunderous_debut.txt +++ b/forge-gui/res/cardsfolder/t/thunderous_debut.txt @@ -2,7 +2,7 @@ Name:Thunderous Debut ManaCost:6 G G Types:Sorcery K:Bargain -A:SP$ Dig | Defined$ You | DigNum$ 20 | SubAbility$ DBChoose | ChangeValid$ Creature | Reveal$ True | NoMove$ True | RememberRevealed$ True | SpellDescription$ Look at the top twenty cards of your library. You may reveal up to two creature cards from among them. If this spell was bargained, put the revealed cards onto the battlefield. Otherwise, put the revealed cards into your hand. Then shuffle. +A:SP$ PeekAndReveal | PeekAmount$ 20 | SubAbility$ DBChoose | NoReveal$ True | RememberPeeked$ True | SpellDescription$ Look at the top twenty cards of your library. You may reveal up to two creature cards from among them. If this spell was bargained, put the revealed cards onto the battlefield. Otherwise, put the revealed cards into your hand. Then shuffle. SVar:DBChoose:DB$ ChooseCard | SubAbility$ DBPutBattlefield | Choices$ Creature.IsRemembered | Amount$ 2 | ChoiceTitle$ Choose up to two creature cards to reveal | ChoiceZone$ Library SVar:DBPutBattlefield:DB$ ChangeZoneAll | Condition$ Bargain | Origin$ Library | Destination$ Battlefield | ChangeType$ Card.ChosenCard | SubAbility$ DBHand SVar:DBHand:DB$ ChangeZoneAll | Origin$ Library | Destination$ Hand | ChangeType$ Card.ChosenCard | SubAbility$ DBShuffle diff --git a/forge-gui/res/cardsfolder/u/ulvenwald_bear.txt b/forge-gui/res/cardsfolder/u/ulvenwald_bear.txt index 47310eb9320..ecafd5ef85e 100644 --- a/forge-gui/res/cardsfolder/u/ulvenwald_bear.txt +++ b/forge-gui/res/cardsfolder/u/ulvenwald_bear.txt @@ -4,5 +4,5 @@ Types:Creature Bear PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ TrigPutCounter | TriggerDescription$ Morbid — When CARDNAME enters, if a creature died this turn, put two +1/+1 counters on target creature. SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 2 -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 Oracle:Morbid — When Ulvenwald Bear enters, if a creature died this turn, put two +1/+1 counters on target creature. diff --git a/forge-gui/res/cardsfolder/v/vengeful_devil.txt b/forge-gui/res/cardsfolder/v/vengeful_devil.txt index 9183fbcb636..005dc265e80 100644 --- a/forge-gui/res/cardsfolder/v/vengeful_devil.txt +++ b/forge-gui/res/cardsfolder/v/vengeful_devil.txt @@ -4,5 +4,5 @@ Types:Creature Devil PT:1/1 K:Haste A:AB$ DealDamage | Cost$ T | ValidTgts$ Any | NumDmg$ 1 | CheckSVar$ Morbid | SVarCompare$ GE1 | SpellDescription$ CARDNAME deals 1 damage to any target. Activate only if a creature died this turn. -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 Oracle:Haste\nMorbid — {T}: Vengeful Devil deals 1 damage to any target. Activate only if a creature died this turn. diff --git a/forge-gui/res/cardsfolder/w/wakedancer.txt b/forge-gui/res/cardsfolder/w/wakedancer.txt index 2e0673ee84a..35cb942dbc3 100644 --- a/forge-gui/res/cardsfolder/w/wakedancer.txt +++ b/forge-gui/res/cardsfolder/w/wakedancer.txt @@ -4,5 +4,5 @@ Types:Creature Human Shaman PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ TrigToken | TriggerDescription$ Morbid — When CARDNAME enters, if a creature died this turn, create a 2/2 black Zombie creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_2_2_zombie | TokenOwner$ You -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 Oracle:Morbid — When Wakedancer enters, if a creature died this turn, create a 2/2 black Zombie creature token. diff --git a/forge-gui/res/cardsfolder/w/woodland_sleuth.txt b/forge-gui/res/cardsfolder/w/woodland_sleuth.txt index a8ff46384fc..f31126e806a 100644 --- a/forge-gui/res/cardsfolder/w/woodland_sleuth.txt +++ b/forge-gui/res/cardsfolder/w/woodland_sleuth.txt @@ -4,5 +4,5 @@ Types:Creature Human Scout PT:2/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | CheckSVar$ Morbid | SVarCompare$ GE1 | TriggerDescription$ Morbid — When CARDNAME enters, if a creature died this turn, return a creature card at random from your graveyard to your hand. SVar:TrigChangeZone:DB$ ChangeZone | ChangeType$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Hand | Hidden$ True | AtRandom$ True -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 Oracle:Morbid — When Woodland Sleuth enters, if a creature died this turn, return a creature card at random from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/z/zombie_ogre.txt b/forge-gui/res/cardsfolder/z/zombie_ogre.txt index 4594b8c47b0..f99d4687dee 100644 --- a/forge-gui/res/cardsfolder/z/zombie_ogre.txt +++ b/forge-gui/res/cardsfolder/z/zombie_ogre.txt @@ -4,5 +4,5 @@ Types:Creature Zombie Ogre PT:3/5 T:Mode$ Phase | Phase$ End of Turn | CheckSVar$ Morbid | SVarCompare$ GE1 | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigVenture | TriggerDescription$ At the beginning of your end step, if a creature died this turn, venture into the dungeon. (Enter the first room or advance to the next room.) SVar:TrigVenture:DB$ Venture -SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +SVar:Morbid:Count$Morbid.1.0 Oracle:At the beginning of your end step, if a creature died this turn, venture into the dungeon. (Enter the first room or advance to the next room.) From aebde7a1d0dab15d0d1772b62e449bcfead9ab53 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Sun, 22 Sep 2024 19:54:02 +0200 Subject: [PATCH 28/37] Fix NPE with Starforged Sword (#6188) * Fix NPE * Fix The Lord of Pain --------- Co-authored-by: TRT <> --- .../java/forge/game/ability/SpellAbilityEffect.java | 2 +- .../main/java/forge/game/player/PlayerProperty.java | 10 +++++----- forge-gui/res/cardsfolder/d/decoy_gambit.txt | 2 +- forge-gui/res/cardsfolder/r/research_development.txt | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index a8f232bb366..5f145d9af5f 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -64,7 +64,7 @@ public abstract class SpellAbilityEffect { // prelude for when this is root ability if (!(sa instanceof AbilitySub)) { sb.append(sa.getHostCard()).append(" -"); - if (sa.getHostCard().hasPromisedGift()) { + if (sa.getHostCard().hasPromisedGift() && sa.hasAdditionalAbility("GiftAbility")) { sb.append(" Gift "). append(sa.getAdditionalAbility("GiftAbility").getParam("GiftDescription")). append(" to ").append(sa.getHostCard().getPromisedGift()).append(". "); diff --git a/forge-game/src/main/java/forge/game/player/PlayerProperty.java b/forge-game/src/main/java/forge/game/player/PlayerProperty.java index aaf3db80bee..e2915155497 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerProperty.java +++ b/forge-game/src/main/java/forge/game/player/PlayerProperty.java @@ -24,11 +24,11 @@ public class PlayerProperty { public static boolean playerHasProperty(Player player, String property, Player sourceController, Card source, CardTraitBase spellAbility) { Game game = player.getGame(); - if (property.endsWith("Activator")) { - sourceController = spellAbility.getHostCard().getController(); - property = property.substring(0, property.length() - 9); - } - if (property.equals("You")) { + if (property.equals("Activator")) { + if (!player.equals(spellAbility.getHostCard().getController())) { + return false; + } + } else if (property.equals("You")) { if (!player.equals(sourceController)) { return false; } diff --git a/forge-gui/res/cardsfolder/d/decoy_gambit.txt b/forge-gui/res/cardsfolder/d/decoy_gambit.txt index 4b28e783873..852d3c3a8fe 100644 --- a/forge-gui/res/cardsfolder/d/decoy_gambit.txt +++ b/forge-gui/res/cardsfolder/d/decoy_gambit.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Instant A:SP$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose up to one target creature each opponent controls | TargetMin$ 0 | TargetMax$ OneEach | TargetsForEachPlayer$ True | SubAbility$ DBRepeat | SpellDescription$ For each opponent, choose up to one target creature that player controls, then return that creature to its owner's hand unless its controller has you draw a card. SVar:DBRepeat:DB$ RepeatEach | DefinedCards$ Targeted | RepeatSubAbility$ DBReturn -SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Battlefield | Destination$ Hand | UnlessCost$ Draw<1/Player.YouActivator> | UnlessPayer$ RememberedController +SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Battlefield | Destination$ Hand | UnlessCost$ Draw<1/Player.Activator> | UnlessPayer$ RememberedController SVar:OneEach:PlayerCountOpponents$Amount Oracle:For each opponent, choose up to one target creature that player controls, then return that creature to its owner's hand unless its controller has you draw a card. diff --git a/forge-gui/res/cardsfolder/r/research_development.txt b/forge-gui/res/cardsfolder/r/research_development.txt index f6ec3f9b409..bd8b3526f55 100644 --- a/forge-gui/res/cardsfolder/r/research_development.txt +++ b/forge-gui/res/cardsfolder/r/research_development.txt @@ -12,5 +12,5 @@ Name:Development ManaCost:3 U R Types:Instant A:SP$ Repeat | RepeatSubAbility$ DBToken | MaxRepeat$ 3 | StackDescription$ SpellDescription | SpellDescription$ Create a 3/1 red Elemental creature token unless any opponent has you draw a card. Repeat this process two more times. -SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_3_1_elemental | TokenOwner$ You | UnlessPayer$ Player.Opponent | UnlessCost$ Draw<1/Player.YouActivator> | UnlessAI$ MorePowerful +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_3_1_elemental | TokenOwner$ You | UnlessPayer$ Player.Opponent | UnlessCost$ Draw<1/Player.Activator> | UnlessAI$ MorePowerful Oracle:Create a 3/1 red Elemental creature token unless any opponent has you draw a card. Repeat this process two more times. From 2b41b1cbe82c5c67a3fd3c1f5817d3bccdfcf507 Mon Sep 17 00:00:00 2001 From: loud1990 <49922764+loud1990@users.noreply.github.com> Date: Sun, 22 Sep 2024 13:56:17 -0400 Subject: [PATCH 29/37] Fixed 2 DSK cards (#6186) Fixed Trial of Agony which wasn't dealing the damage, and Disturbing Mirth which was only allowing you to sacrifice another enchantment (not a creature). --- forge-gui/res/cardsfolder/upcoming/disturbing_mirth.txt | 2 +- forge-gui/res/cardsfolder/upcoming/trial_of_agony.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/disturbing_mirth.txt b/forge-gui/res/cardsfolder/upcoming/disturbing_mirth.txt index 3a90a43caf5..5339ff384ed 100644 --- a/forge-gui/res/cardsfolder/upcoming/disturbing_mirth.txt +++ b/forge-gui/res/cardsfolder/upcoming/disturbing_mirth.txt @@ -2,7 +2,7 @@ Name:Disturbing Mirth ManaCost:B R Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters, you may sacrifice another enchantment or creature. If you do, draw two cards. -SVar:TrigDraw:AB$ Draw | Cost$ Sac<1/Enchantment.Other,Creature.Other/another enchantment or creature> | NumCards$ 2 +SVar:TrigDraw:AB$ Draw | Cost$ Sac<1/Enchantment.Other;Creature.Other/another enchantment or creature> | NumCards$ 2 T:Mode$ Sacrificed | ValidPlayer$ You | ValidCard$ Card.Self | Execute$ TrigDread | TriggerZones$ Battlefield | TriggerDescription$ When you sacrifice CARDNAME, manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) SVar:TrigDread:DB$ ManifestDread DeckHas:Ability$Sacrifice diff --git a/forge-gui/res/cardsfolder/upcoming/trial_of_agony.txt b/forge-gui/res/cardsfolder/upcoming/trial_of_agony.txt index 8649457d236..2c5596fadc0 100644 --- a/forge-gui/res/cardsfolder/upcoming/trial_of_agony.txt +++ b/forge-gui/res/cardsfolder/upcoming/trial_of_agony.txt @@ -3,7 +3,7 @@ ManaCost:R Types:Sorcery A:SP$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select two target creatures controlled by the same opponent | TargetMin$ 2 | TargetMax$ 2 | TargetsFromSingleZone$ True | IsCurse$ True | RememberTargets$ True | SubAbility$ DBChoose | StackDescription$ SpellDescription | SpellDescription$ Choose two target creatures controlled by the same opponent. That player chooses one of those creatures. CARDNAME deals 5 damage to that creature, and the other can't block this turn. SVar:DBChoose:DB$ ChooseCard | Defined$ TargetedController | Mandatory$ True | Choices$ Creature.IsRemembered | ChoiceTitle$ Choose one to take 5 damage | ForgetChosen$ True | SubAbility$ DBDealDamage -SVar:DBDealDamage:DB$ DealDamage | Defined$ ChosenCard | SubAbility$ DBCantBlock +SVar:DBDealDamage:DB$ DealDamage | NumDmg$ 5 | Defined$ ChosenCard | SubAbility$ DBCantBlock SVar:DBCantBlock:DB$ Pump | Defined$ Remembered | KW$ HIDDEN CARDNAME can't block. | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:Choose two target creatures controlled by the same opponent. That player chooses one of those creatures. Trial of Agony deals 5 damage to that creature, and the other can't block this turn. From 3df6319efae3461170d928cb48d6ed2cbddc7961 Mon Sep 17 00:00:00 2001 From: Paul Hammerton <18243520+paulsnoops@users.noreply.github.com> Date: Mon, 23 Sep 2024 17:46:46 +0100 Subject: [PATCH 30/37] Commander Banned and Restricted September 23, 2024 --- forge-gui/res/formats/Casual/Commander.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/formats/Casual/Commander.txt b/forge-gui/res/formats/Casual/Commander.txt index f98af3000b7..d83f943ab00 100644 --- a/forge-gui/res/formats/Casual/Commander.txt +++ b/forge-gui/res/formats/Casual/Commander.txt @@ -3,4 +3,4 @@ Name:Commander Type:Casual Subtype:Commander Order:137 -Banned:Adriana's Valor; Advantageous Proclamation; Ashnod's Coupon; Assemble the Rank and Vile; Backup Plan; Brago's Favor; Double Cross; Double Deal; Double Dip; Double Play; Double Stroke; Double Take; Echoing Boon; Emissary's Ploy; Enter the Dungeon; Flash; Hired Heist; Hold the Perimeter; Hullbreacher; Hymn of the Wilds; Immediate Action; Incendiary Dissent; Iterative Analysis; Lutri, the Spellchaser; Magical Hacker; Mox Lotus; Muzzio's Preparations; Natural Unity; Once More with Feeling; Power Play; R&D's Secret Lair; Richard Garfield, Ph.D.; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Sovereign's Realm; Staying Power; Summoner's Bond; Time Machine; Unexpected Potential; Weight Advantage; Worldknit; Amulet of Quoz; Bronze Tablet; Contract from Below; Darkpact; Demonic Attorney; Jeweled Bird; Rebirth; Tempest Efreet; Timmerian Fiends; Ancestral Recall; Balance; Biorhythm; Black Lotus; Braids, Cabal Minion; Chaos Orb; Coalition Victory; Channel; Emrakul, the Aeons Torn; Erayo, Soratami Ascendant; Falling Star; Fastbond; Gifts Ungiven; Griselbrand; Iona, Shield of Emeria; Karakas; Leovold, Emissary of Trest; Library of Alexandria; Limited Resources; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Panoptic Mirror; Paradox Engine; Primeval Titan; Prophet of Kruphix; Recurring Nightmare; Rofellos, Llanowar Emissary; Shahrazad; Sundering Titan; Sway of the Stars; Sylvan Primordial; Time Vault; Time Walk; Tinker; Tolarian Academy; Trade Secrets; Upheaval; Yawgmoth's Bargain; Cleanse; Crusade; Imprison; Invoke Prejudice; Jihad; Pradesh Gypsies; Stone-Throwing Devils; Golos, Tireless Pilgrim +Banned:Adriana's Valor; Advantageous Proclamation; Ashnod's Coupon; Assemble the Rank and Vile; Backup Plan; Brago's Favor; Dockside Extortionist; Double Cross; Double Deal; Double Dip; Double Play; Double Stroke; Double Take; Echoing Boon; Emissary's Ploy; Enter the Dungeon; Flash; Hired Heist; Hold the Perimeter; Hullbreacher; Hymn of the Wilds; Immediate Action; Incendiary Dissent; Iterative Analysis; Jeweled Lotus; Lutri, the Spellchaser; Magical Hacker; Mana Crypt; Mox Lotus; Muzzio's Preparations; Nadu, Winged Wisdom; Natural Unity; Once More with Feeling; Power Play; R&D's Secret Lair; Richard Garfield, Ph.D.; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Sovereign's Realm; Staying Power; Summoner's Bond; Time Machine; Unexpected Potential; Weight Advantage; Worldknit; Amulet of Quoz; Bronze Tablet; Contract from Below; Darkpact; Demonic Attorney; Jeweled Bird; Rebirth; Tempest Efreet; Timmerian Fiends; Ancestral Recall; Balance; Biorhythm; Black Lotus; Braids, Cabal Minion; Chaos Orb; Coalition Victory; Channel; Emrakul, the Aeons Torn; Erayo, Soratami Ascendant; Falling Star; Fastbond; Gifts Ungiven; Griselbrand; Iona, Shield of Emeria; Karakas; Leovold, Emissary of Trest; Library of Alexandria; Limited Resources; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Panoptic Mirror; Paradox Engine; Primeval Titan; Prophet of Kruphix; Recurring Nightmare; Rofellos, Llanowar Emissary; Shahrazad; Sundering Titan; Sway of the Stars; Sylvan Primordial; Time Vault; Time Walk; Tinker; Tolarian Academy; Trade Secrets; Upheaval; Yawgmoth's Bargain; Cleanse; Crusade; Imprison; Invoke Prejudice; Jihad; Pradesh Gypsies; Stone-Throwing Devils; Golos, Tireless Pilgrim From dd5aa11742d4e9e38757314d582f414b398bfd8c Mon Sep 17 00:00:00 2001 From: kevlahnota Date: Tue, 24 Sep 2024 20:38:59 +0800 Subject: [PATCH 31/37] Update a_premonition_of_your_demise.txt --- .../res/cardsfolder/upcoming/a_premonition_of_your_demise.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/a_premonition_of_your_demise.txt b/forge-gui/res/cardsfolder/upcoming/a_premonition_of_your_demise.txt index 141d9a98e09..a134c66e025 100644 --- a/forge-gui/res/cardsfolder/upcoming/a_premonition_of_your_demise.txt +++ b/forge-gui/res/cardsfolder/upcoming/a_premonition_of_your_demise.txt @@ -1,7 +1,7 @@ Name:A Premonition of Your Demise ManaCost:no cost Types:Scheme -T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ TrigRepeatEach | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, reveal the top two cards of your library and put them into your hand. When you reveal one or more nonland cards this way, this scheme deals damage equal to their total mana value to any target. +T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DBDig | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, reveal the top two cards of your library and put them into your hand. When you reveal one or more nonland cards this way, this scheme deals damage equal to their total mana value to any target. SVar:DBDig:DB$ Dig | DigNum$ 2 | Reveal$ True | ChangeNum$ All | ChangeValid$ Card | DestinationZone$ Hand | RememberChanged$ True | SubAbility$ DBImmediateTrigger SVar:DBImmediateTrigger:DB$ ImmediateTrigger | ConditionDefined$ Remembered | ConditionPresent$ Card.nonLand | Execute$ TrigDamage | SubAbility$ DBCleanup | SpellDescription$ When you reveal one or more nonland cards this way, this scheme deals damage equal to their total mana value to any target. SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Any | NumDmg$ X From 35cd7d0f4eee531892a945f36dd72bbd51a923d3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 25 Sep 2024 11:02:22 +0300 Subject: [PATCH 32/37] - Add puzzle PS_BLB4, fix GameState support for class level. (#6195) --- forge-ai/src/main/java/forge/ai/GameState.java | 2 +- forge-gui/res/puzzle/PS_BLB4.pzl | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/puzzle/PS_BLB4.pzl diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index e663feb77da..4939cdd9282 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -1398,7 +1398,7 @@ public abstract class GameState { c.setTurnInZone(turn); } else if (info.equals("IsToken")) { c.setGamePieceType(GamePieceType.TOKEN); - } else if (info.equals("ClassLevel:")) { + } else if (info.startsWith("ClassLevel:")) { c.setClassLevel(Integer.parseInt(info.substring(info.indexOf(':') + 1))); } } diff --git a/forge-gui/res/puzzle/PS_BLB4.pzl b/forge-gui/res/puzzle/PS_BLB4.pzl new file mode 100644 index 00000000000..6ce0bc5ecad --- /dev/null +++ b/forge-gui/res/puzzle/PS_BLB4.pzl @@ -0,0 +1,16 @@ +[metadata] +Name:Possibility Storm - Bloomburrow #04 +URL:https://i2.wp.com/www.possibilitystorm.com/wp-content/uploads/2024/09/latest-scaled.jpg?ssl=1 +Goal:Win +Turns:1 +Difficulty:Mythic +Description:Win this turn. Ensure your solution satisfies all possible blocking decisions. Good luck! +[state] +turn=1 +activeplayer=p0 +activephase=MAIN1 +p0life=20 +p0hand=Ornery Tumblewagg;Oko, the Ringleader;Season of Gathering;Shivan Devastator;Ferocification +p0battlefield=Innkeeper's Talent|ClassLevel:2;Rampaging Geoderm;Kami of Whispered Hopes|Counters:P1P1=2;Island;Island;Mountain;Mountain;Forest;Forest +p1life=17 +p1battlefield=Fear of Immobility;Shield-Wall Sentinel From fb5d9a0b562eb03d6898b0a9d7c9aeba0d2a4cc5 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Wed, 25 Sep 2024 10:02:36 +0200 Subject: [PATCH 33/37] Update valgavoths_onslaught.txt (#6187) --- forge-gui/res/cardsfolder/upcoming/valgavoths_onslaught.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/valgavoths_onslaught.txt b/forge-gui/res/cardsfolder/upcoming/valgavoths_onslaught.txt index b40db49938f..96b8e79f6f4 100644 --- a/forge-gui/res/cardsfolder/upcoming/valgavoths_onslaught.txt +++ b/forge-gui/res/cardsfolder/upcoming/valgavoths_onslaught.txt @@ -1,6 +1,6 @@ Name:Valgavoth's Onslaught ManaCost:X X G -Types:Instant +Types:Sorcery A:SP$ ManifestDread | Amount$ X | RememberManifested$ True | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | Defined$ RememberedCard | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True From 68db59f080528e5a9a72e326fbd97ad8f4c36c95 Mon Sep 17 00:00:00 2001 From: Ayora29 Date: Wed, 25 Sep 2024 13:01:18 +0200 Subject: [PATCH 34/37] New dsk card : Monstrous Emergence (#6194) --- forge-gui/res/cardsfolder/upcoming/friendly_teddy.txt | 4 ++-- .../res/cardsfolder/upcoming/monstruous_emergence.txt | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/monstruous_emergence.txt diff --git a/forge-gui/res/cardsfolder/upcoming/friendly_teddy.txt b/forge-gui/res/cardsfolder/upcoming/friendly_teddy.txt index 95cb1eb8a63..28d409da95f 100644 --- a/forge-gui/res/cardsfolder/upcoming/friendly_teddy.txt +++ b/forge-gui/res/cardsfolder/upcoming/friendly_teddy.txt @@ -2,6 +2,6 @@ Name:Friendly Teddy ManaCost:2 Types:Artifact Creature Bear Toy PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters, each player draws a card. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME dies, each player draws a card. SVar:TrigDraw:DB$ Draw | Defined$ Player -Oracle:When Friendly Teddy enters, each player draws a card. \ No newline at end of file +Oracle:When Friendly Teddy dies, each player draws a card. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/monstruous_emergence.txt b/forge-gui/res/cardsfolder/upcoming/monstruous_emergence.txt new file mode 100644 index 00000000000..1473bb4189d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/monstruous_emergence.txt @@ -0,0 +1,7 @@ +Name:Monstrous Emergence +ManaCost:1 G +Types:Sorcery +A:SP$ DealDamage | Cost$ 1 G RevealOrChoose<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the power of the creature you chose or the card you revealed to target creature. +SVar:X:Revealed$CardPower +AI:RemoveDeck:All +Oracle:As an additional cost to cast this spell, choose a creature you control or reveal a creature card from your hand.\nMonstrous Emergence deals damage equal to the power of the creature you chose or the card you revealed to target creature. From 786d6834ef17bb91e3e76e36cbfd2bf1ec1dc268 Mon Sep 17 00:00:00 2001 From: Michael Lo Date: Wed, 25 Sep 2024 15:58:28 +0100 Subject: [PATCH 35/37] Fix valiant cards only triggering once per game rather than once per turn (#6196) --- forge-game/src/main/java/forge/game/card/Card.java | 1 + 1 file changed, 1 insertion(+) 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 df4e2fc8cfe..fe5b8489d91 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -7206,6 +7206,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr setRegeneratedThisTurn(0); resetShieldCount(); setBecameTargetThisTurn(false); + setValiant(false); setFoughtThisTurn(false); turnedFaceUpThisTurn = false; clearMustBlockCards(); From 2ac31bf45cc05d3ac0e9b8bf90432840a7c2634a Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Wed, 25 Sep 2024 20:19:53 +0200 Subject: [PATCH 36/37] Rename monstruous_emergence.txt to monstrous_emergence.txt (#6197) --- .../{monstruous_emergence.txt => monstrous_emergence.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename forge-gui/res/cardsfolder/upcoming/{monstruous_emergence.txt => monstrous_emergence.txt} (100%) diff --git a/forge-gui/res/cardsfolder/upcoming/monstruous_emergence.txt b/forge-gui/res/cardsfolder/upcoming/monstrous_emergence.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/monstruous_emergence.txt rename to forge-gui/res/cardsfolder/upcoming/monstrous_emergence.txt From 941a1129e540a424331d3d992326fae0138178d6 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Thu, 26 Sep 2024 07:52:08 +0200 Subject: [PATCH 37/37] Make Myriad optional for each player again (#6191) * Make Myriad optional for each player again * Fix scripts * Fix NPE due to not removing empty shards --------- Co-authored-by: TRT <> Co-authored-by: tool4EvEr --- .../game/ability/effects/CopyPermanentEffect.java | 4 ++++ .../main/java/forge/game/card/CardFactoryUtil.java | 2 +- .../main/java/forge/game/mana/ManaCostBeingPaid.java | 12 ++++++------ forge-gui/res/cardsfolder/d/doomsday.txt | 2 +- forge-gui/res/cardsfolder/s/saw_in_half.txt | 2 +- .../cardsfolder/upcoming/valgavoth_terror_eater.txt | 2 +- 6 files changed, 14 insertions(+), 10 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index 7f3ca431d7d..08ac7418f67 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -258,6 +258,10 @@ public class CopyPermanentEffect extends TokenEffectBase { if (sa.hasParam("ForEach")) { for (Player p : AbilityUtils.getDefinedPlayers(host, sa.getParam("ForEach"), sa)) { + if (sa.hasParam("OptionalForEach") && !activator.getController().confirmAction(sa, null, + Localizer.getInstance().getMessage("lblCopyPermanentConfirm") + " (" + p + ")", null)) { + continue; + } Card proto = getProtoType(sa, c, controller); proto.addRemembered(p); tokenTable.put(controller, proto, numCopies); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 4d64ee8fb2d..ecb07b2b39b 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1553,7 +1553,7 @@ public class CardFactoryUtil { final String actualTrigger = "Mode$ Attacks | ValidCard$ Card.Self | Secondary$ True" + " | TriggerDescription$ Myriad (" + inst.getReminderText() + ")"; - final String copyStr = "DB$ CopyPermanent | Defined$ Self | TokenTapped$ True | Optional$ True | TokenAttacking$ RememberedPlayer & Valid Planeswalker.ControlledBy Remembered" + final String copyStr = "DB$ CopyPermanent | Defined$ Self | TokenTapped$ True | OptionalForEach$ True | TokenAttacking$ RememberedPlayer & Valid Planeswalker.ControlledBy Remembered" + "| ForEach$ OppNonDefendingPlayer | AtEOT$ ExileCombat | CleanupForEach$ True"; final SpellAbility copySA = AbilityFactory.getAbility(copyStr, card); diff --git a/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java b/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java index 1b2933d00f0..04788a01ae3 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java +++ b/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java @@ -307,7 +307,7 @@ public class ManaCostBeingPaid { sc.xCount = sc.totalCount; } // nothing more left in otherSubtract - return; + break; } } } @@ -327,7 +327,7 @@ public class ManaCostBeingPaid { sc.xCount = sc.totalCount; } // nothing more left in otherSubtract - return; + break; } } } @@ -347,7 +347,7 @@ public class ManaCostBeingPaid { sc.xCount = sc.totalCount; } // nothing more left in otherSubtract - return; + break; } } } @@ -367,7 +367,7 @@ public class ManaCostBeingPaid { sc.xCount = sc.totalCount; } // nothing more left in otherSubtract - return; + break; } } } @@ -389,7 +389,7 @@ public class ManaCostBeingPaid { sc.xCount = sc.totalCount; } // nothing more left in otherSubtract - return; + break; } } else if (sc.xCount > 0) { // X part that can only be paid by specific color if (otherSubtract >= sc.xCount) { @@ -403,7 +403,7 @@ public class ManaCostBeingPaid { sc.totalCount -= otherSubtract; sc.xCount -= otherSubtract; // nothing more left in otherSubtract - return; + break; } } } diff --git a/forge-gui/res/cardsfolder/d/doomsday.txt b/forge-gui/res/cardsfolder/d/doomsday.txt index 2554696e343..e0b92280dc4 100644 --- a/forge-gui/res/cardsfolder/d/doomsday.txt +++ b/forge-gui/res/cardsfolder/d/doomsday.txt @@ -1,7 +1,7 @@ Name:Doomsday ManaCost:B B B Types:Sorcery -A:SP$ ChangeZone | Origin$ Graveyard,Library | Destination$ Library | ChangeType$ Card | ChangeNum$ 5 | SubAbility$ DBChangeZone | RememberChanged$ True | Mandatory$ True | SpellDescription$ Search your library and graveyard for five cards and exile the rest. Put the chosen cards on top of your library in any order. You lose half your life, rounded up. +A:SP$ ChangeZone | Origin$ Graveyard,Library | Destination$ Library | ChangeType$ Card | ChangeNum$ 5 | Shuffle$ False | SubAbility$ DBChangeZone | RememberChanged$ True | Mandatory$ True | SpellDescription$ Search your library and graveyard for five cards and exile the rest. Put the chosen cards on top of your library in any order. You lose half your life, rounded up. SVar:DBChangeZone:DB$ ChangeZoneAll | Defined$ You | Origin$ Graveyard,Library | Destination$ Exile | ChangeType$ Card.IsNotRemembered | SubAbility$ DBDig SVar:DBDig:DB$ RearrangeTopOfLibrary | Defined$ You | NumCards$ X | SubAbility$ DBLoseLife SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ Y | SubAbility$ DBCleanup diff --git a/forge-gui/res/cardsfolder/s/saw_in_half.txt b/forge-gui/res/cardsfolder/s/saw_in_half.txt index 9a6f9ba25af..de86038d9a0 100644 --- a/forge-gui/res/cardsfolder/s/saw_in_half.txt +++ b/forge-gui/res/cardsfolder/s/saw_in_half.txt @@ -2,7 +2,7 @@ Name:Saw in Half ManaCost:2 B Types:Instant A:SP$ Destroy | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBCopy | RememberLKI$ True | SpellDescription$ Destroy target creature. -SVar:DBCopy:DB$ CopyPermanent | Defined$ Remembered | NumCopies$ 2 | Controller$ TargetedController | SetPower$ dX | SetToughness$ dY | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ If that creature dies this way, its controller creates two tokens that are copies of that creature, except their base power is half that creature's power and their base toughness is half that creature's toughness. Round up each time. +SVar:DBCopy:DB$ CopyPermanent | Defined$ RememberedLKI | NumCopies$ 2 | Controller$ TargetedController | SetPower$ dX | SetToughness$ dY | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ If that creature dies this way, its controller creates two tokens that are copies of that creature, except their base power is half that creature's power and their base toughness is half that creature's toughness. Round up each time. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount SVar:dX:RememberedLKI$CardPower/HalfUp diff --git a/forge-gui/res/cardsfolder/upcoming/valgavoth_terror_eater.txt b/forge-gui/res/cardsfolder/upcoming/valgavoth_terror_eater.txt index 8d953f72576..6f003372032 100644 --- a/forge-gui/res/cardsfolder/upcoming/valgavoth_terror_eater.txt +++ b/forge-gui/res/cardsfolder/upcoming/valgavoth_terror_eater.txt @@ -5,7 +5,7 @@ PT:9/9 K:Flying K:Lifelink K:Ward:Sac<3/Permanent.nonLand/nonland permanent> -R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Graveyard | ValidCard$ Card.nonToken+YouDontCtrl+OppOwn | ReplaceWith$ Exile | Description$ If a card you didn't control would be put into an opponent's graveyard from anywhere, exile it instead. +R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Graveyard | ValidLKI$ Card.nonToken+YouDontCtrl+OppOwn | ReplaceWith$ Exile | Description$ If a card you didn't control would be put into an opponent's graveyard from anywhere, exile it instead. SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard S:Mode$ Continuous | Condition$ PlayerTurn | MayPlay$ True | Affected$ Card.ExiledWithSource | AffectedZone$ Exile | MayPlayAltManaCost$ PayLife | Description$ During your turn, you may play cards exiled with NICKNAME. If you cast a spell this way, pay life equal to its mana value rather than pay its mana cost. Oracle:Flying, lifelink\nWard—Sacrifice three nonland permanents.\nIf a card you didn't control would be put into an opponent's graveyard from anywhere, exile it instead.\nDuring your turn, you may play cards exiled with Valgavoth. If you cast a spell this way, pay life equal to its mana value rather than pay its mana cost. \ No newline at end of file