From c4fc89f234c5fe02ba9f3a7289688fa1cc0ca209 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Thu, 17 Sep 2020 18:52:54 +0800 Subject: [PATCH 01/96] change to use scryfall api get image(see https://scryfall.com/blog 2020/8/6 blog) --- forge-gui/src/main/java/forge/util/ImageFetcher.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java index ef83a64f414..d3cbcc74a55 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -68,7 +68,8 @@ public abstract class ImageFetcher { suffix = (backFace ? "b" : "a"); } final String editionMciCode = data.getEditions().getMciCodeByCode(paperCard.getEdition()); - downloadUrls.add(String.format("https://img.scryfall.com/cards/normal/en/%s/%s%s.jpg", editionMciCode, cardNum, suffix)); + //see https://scryfall.com/blog 2020/8/6, and https://scryfall.com/docs/api/cards/collector + downloadUrls.add(String.format("https://api.scryfall.com/cards/%s/%s%s/en?format=image&version=normal", editionMciCode, cardNum, suffix)); } } else if (prefix.equals(ImageKeys.TOKEN_PREFIX)) { if (tokenImages == null) { From 70682f73937d0d1fc4c5bd0cc31eed777137ec68 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 08:02:54 -0400 Subject: [PATCH 02/96] - Oracle fix --- .../upcoming/ZNR/blackbloom_rogue_blackbloom_bog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/blackbloom_rogue_blackbloom_bog.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/blackbloom_rogue_blackbloom_bog.txt index e0a1b72f2c0..aff69e4823a 100644 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/blackbloom_rogue_blackbloom_bog.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/blackbloom_rogue_blackbloom_bog.txt @@ -6,7 +6,7 @@ K:Menace S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 3 | CheckSVar$ X | SVarCompare$ GE8 | Description$ CARDNAME gets +3/+0 as long as an opponent has eight or more cards in their graveyard. SVar:X:PlayerCountOpponents$HighestCardsInGraveyard AlternateMode:Modal -Oracle:Blackbloom Rogue gets +3/+0 as long as an opponent has eight or more cards in their graveyard. +Oracle:Menace\nBlackbloom Rogue gets +3/+0 as long as an opponent has eight or more cards in their graveyard. ALTERNATE From d4b68cf7b80e3cfe46d255b00de28bb86f675779 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 08:03:25 -0400 Subject: [PATCH 03/96] akoum_warrior_akoum_teeth.txt --- .../upcoming/ZNR/akoum_warrior_akoum_teeth.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/akoum_warrior_akoum_teeth.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/akoum_warrior_akoum_teeth.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/akoum_warrior_akoum_teeth.txt new file mode 100644 index 00000000000..b6528587290 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/akoum_warrior_akoum_teeth.txt @@ -0,0 +1,16 @@ +Name:Akoum Warrior +ManaCost:5 R +Types:Creature Minotaur Warrior +PT:4/5 +K:Trample +AlternateMode:Modal +Oracle:Trample + +ALTERNATE + +Name:Akoum Teeth +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +Oracle:Akoum Teeth enters the battlefield tapped.\n{T}: Add {R}. From e1371a55063b15826067cd3533a34211be7aa5fa Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 08:16:35 -0400 Subject: [PATCH 04/96] kazuuls_fury_kazuuls_cliffs.txt --- .../ZNR/kazuuls_fury_kazuuls_cliffs.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/kazuuls_fury_kazuuls_cliffs.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kazuuls_fury_kazuuls_cliffs.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/kazuuls_fury_kazuuls_cliffs.txt new file mode 100644 index 00000000000..b0b45d16807 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/kazuuls_fury_kazuuls_cliffs.txt @@ -0,0 +1,17 @@ +Name:Kazuul's Fury +ManaCost:2 R +Types:Instant +A:SP$ DealDamage | Cost$ 2 R Sac<1/Creature> | NumDmg$ X | References$ X | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | SpellDescription$ CARDNAME deals damage equal to the sacrificed creature's power to any target. +SVar:X:Sacrificed$CardPower +DeckHas:Ability$Sacrifice +AlternateMode:Modal +Oracle:As an additional cost to cast this spell, sacrifice a creature. Kazuul's Fury deals damage equal to the sacrificed creature's power to any target. + +ALTERNATE + +Name:Kazuul's Cliffs +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +Oracle:Kazuul's Cliffs enters the battlefield tapped.\n{T}: Add {R}. From a2d166e80af188378ed88ef8904cbb4e3822930d Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 08:16:49 -0400 Subject: [PATCH 05/96] song_mad_treachery_song_mad_ruins.txt --- .../ZNR/song_mad_treachery_song_mad_ruins.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/song_mad_treachery_song_mad_ruins.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/song_mad_treachery_song_mad_ruins.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/song_mad_treachery_song_mad_ruins.txt new file mode 100644 index 00000000000..2d82b98865e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/song_mad_treachery_song_mad_ruins.txt @@ -0,0 +1,15 @@ +Name:Song-Mad Treachery +ManaCost:3 R R +Types:Sorcery +A:SP$ GainControl | Cost$ 3 R R | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | StackDescription$ {p:You} gains control of {c:Targeted} until end of turn. Untap it. It gains haste until end of turn. | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. +AlternateMode:Modal +Oracle:Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. + +ALTERNATE + +Name:Song-Mad Ruins +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +Oracle:Song-Mad Ruins enters the battlefield tapped.\n{T}: Add {R}. From 06b0476e2f0ffa1416d9ec902e99e8228fb76c93 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 10:42:17 -0400 Subject: [PATCH 06/96] shatterskull_smashing_shatterskull_the_hammer_pass.txt --- ..._smashing_shatterskull_the_hammer_pass.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_smashing_shatterskull_the_hammer_pass.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_smashing_shatterskull_the_hammer_pass.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_smashing_shatterskull_the_hammer_pass.txt new file mode 100644 index 00000000000..3d415f23313 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_smashing_shatterskull_the_hammer_pass.txt @@ -0,0 +1,19 @@ +Name:Shatterskull Smashing +ManaCost:X R R +Types:Sorcery +A:SP$ DealDamage | Cost$ X R R | NumDmg$ Y | References$ X,Y,Z | ValidTgts$ Creature,Planeswalker | TargetMin$ 0 | TargetMax$ 2 | DividedAsYouChoose$ Y | TgtPrompt$ Select up to two target creatures and/or planeswalkers | SpellDescription$ CARDNAME deals X damage divided as you choose among up to two target creatures and/or planeswalkers. If X is 6 or more, CARDNAME deals twice X damage divided as you choose among them instead. +SVar:X:Count$xPaid +SVar:Y:Count$Compare X LT6.X.Z +SVar:Z:Count$xPaid/Twice +AlternateMode:Modal +Oracle:Shatterskull Smashing deals X damage divided as you choose among up to two target creatures and/or planeswalkers. If X is 6 or more, Shatterskull Smashing deals twice X damage divided as you choose among them instead. + +ALTERNATE + +Name:Shatterskull, the Hammer Pass +ManaCost:no cost +Types:Land +K:ETBReplacement:Other:DBTap +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<3> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +Oracle:As Shatterskull, the Hammer Pass enters the battlefield, you may pay 3 life. If you don’t, it enters the battlefield tapped.\n{T}: Add {R}. From 2322d4721832768b5b86cfb62c2a7a4a7da1af4e Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 10:45:55 -0400 Subject: [PATCH 07/96] spikefield_hazard_spikefield_cave.txt --- .../ZNR/spikefield_hazard_spikefield_cave.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/spikefield_hazard_spikefield_cave.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/spikefield_hazard_spikefield_cave.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/spikefield_hazard_spikefield_cave.txt new file mode 100644 index 00000000000..61504f179a9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/spikefield_hazard_spikefield_cave.txt @@ -0,0 +1,15 @@ +Name:Spikefield Hazard +ManaCost:R +Types:Instant +A:SP$ DealDamage | Cost$ R | NumDmg$ 1 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | ReplaceDyingDefined$ Targeted | SpellDescription$ CARDNAME deals 1 damage to any target. If a permanent dealt damage this way would die this turn, exile it instead. +AlternateMode:Modal +Oracle:Spikefield Hazard deals 1 damage to any target. If a permanent dealt damage this way would die this turn, exile it instead. + +ALTERNATE + +Name:Spikefield Cave +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +Oracle:Spikefield Cave enters the battlefield tapped.\n{T}: Add {R}. From 45164c5d069b177be04deef3aa18184807af894b Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 10:47:07 -0400 Subject: [PATCH 08/96] shatterskull_minotaur.txt --- .../cardsfolder/upcoming/ZNR/shatterskull_minotaur.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_minotaur.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_minotaur.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_minotaur.txt new file mode 100644 index 00000000000..2c5507f62d9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_minotaur.txt @@ -0,0 +1,10 @@ +Name:Shatterskull Minotaur +ManaCost:4 R R +Types:Creature Minotaur Warrior +PT:5/4 +K:Haste +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | References$ X | Description$ This spell costs {1} less to cast for each creature in your party. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.) +SVar:X:Count$Party +DeckHas:Ability$Party +DeckHints:Type$Cleric|Rogue|Wizard +Oracle:This spell costs {1} less to cast for each creature in your party. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.)\nHaste From 45a582dfaa202b84f1004998a541989e4f445599 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 12:05:59 -0400 Subject: [PATCH 09/96] valakut_awakening_valakut_stoneforge.txt --- .../valakut_awakening_valakut_stoneforge.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/valakut_awakening_valakut_stoneforge.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/valakut_awakening_valakut_stoneforge.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/valakut_awakening_valakut_stoneforge.txt new file mode 100644 index 00000000000..4e26492a92a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/valakut_awakening_valakut_stoneforge.txt @@ -0,0 +1,19 @@ +Name:Valakut Awakening +ManaCost:2 R +Types:Instant +A:SP$ ChangeZone | Cost$ 2 R | Origin$ Hand | Destination$ Library | LibraryPosition$ -1 | ChangeType$ Card | ChangeNum$ X | References$ X | RememberChanged$ True | SubAbility$ DBDraw | StackDescription$ {p:You} puts any number of cards from their hand on the bottom of their library, | SpellDescription$ Put any number of cards from your hand on the bottom of your library, then draw that many cards plus one. +SVar:DBDraw:DB$ Draw | NumCards$ Y | References$ Y | SubAbility$ DBCleanup | StackDescription$ then draws that many cards plus one. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$InYourHand +SVar:Y:Count$RememberedSize/Plus.1 +AlternateMode:Modal +Oracle:Put any number of cards from your hand on the bottom of your library, then draw that many cards plus one. + +ALTERNATE + +Name:Valakut Stoneforge +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +Oracle:Valakut Stoneforge enters the battlefield tapped.\n{T}: Add {R}. From a3c4451a49434bc14833cbe0dfe6229a78373223 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 12:06:12 -0400 Subject: [PATCH 10/96] wayward_guide_beast.txt --- .../res/cardsfolder/upcoming/ZNR/wayward_guide_beast.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/wayward_guide_beast.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/wayward_guide_beast.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/wayward_guide_beast.txt new file mode 100755 index 00000000000..46793180bbf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/wayward_guide_beast.txt @@ -0,0 +1,9 @@ +Name:Wayward Guide-Beast +ManaCost:R +Types:Creature Beast +PT:2/2 +K:Trample +K:Haste +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigBounce | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, return a land you control to its owner's hand. +SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ChangeType$ Land.YouCtrl | ChangeNum$ 1 | Hidden$ True | Mandatory$ True | SelectPrompt$ Select a land you control to return to its owner's hand +Oracle:Trample, haste\nWhenever Wayward Guide-Beast deals combat damage to a player, return a land you control to its owner's hand. From a9f566624547c1a1c5be8c49ee4c80bae4fd21f2 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 13:14:56 -0400 Subject: [PATCH 11/96] ancient_greenwarden.txt --- .../res/cardsfolder/upcoming/ZNR/ancient_greenwarden.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/ancient_greenwarden.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/ancient_greenwarden.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/ancient_greenwarden.txt new file mode 100755 index 00000000000..23c4fd8f267 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/ancient_greenwarden.txt @@ -0,0 +1,8 @@ +Name:Ancient Greenwarden +ManaCost:4 G G +Types:Creature Elemental +PT:5/7 +K:Reach +S:Mode$ Continuous | Affected$ Land.YouCtrl | MayPlay$ True | AffectedZone$ Graveyard | Description$ You may play lands from your graveyard. +K:Panharmonicon:Land:If a land entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. +Oracle:Reach\nYou may play lands from your graveyard.\nIf a land entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. From cf2c3e51eebe9812d05388be5743e64f10e1800c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 13:15:11 -0400 Subject: [PATCH 12/96] ashaya_soul_of_the_wild.txt --- .../upcoming/ZNR/ashaya_soul_of_the_wild.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/ashaya_soul_of_the_wild.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/ashaya_soul_of_the_wild.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/ashaya_soul_of_the_wild.txt new file mode 100755 index 00000000000..dfd02eb91d2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/ashaya_soul_of_the_wild.txt @@ -0,0 +1,12 @@ +Name:Ashaya, Soul of the Wild +ManaCost:3 G G +Types:Legendary Creature Elemental +PT:*/* +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of lands you control. +S:Mode$ Continuous | Affected$ Creature.nonToken+YouCtrl | AddType$ Forest & Land | Description$ Nontoken creatures you control are Forest lands in addition to their other types. (They're still affected by summoning sickness.) +SVar:X:Count$Valid Land.YouCtrl +SVar:Y:Count$Valid Creature.nonToken+YouCtrl +SVar:Z:SVar$X/Plus.Y +SVar:NeedsToPlayVar:Z GE4 +SVar:BuffedBy:Land,Creature +Oracle:Ashaya, Soul of the Wild's power and toughness are each equal to the number of lands you control.\nNontoken creatures you control are Forest lands in addition to their other types. (They're still affected by summoning sickness.) From ba2d0df4c38cf0f975beb6a4a1d6387adb5dc8fd Mon Sep 17 00:00:00 2001 From: paul_snoops Date: Thu, 17 Sep 2020 18:35:31 +0100 Subject: [PATCH 13/96] Thank you Northmoc! --- .../cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt new file mode 100644 index 00000000000..818c3e14924 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt @@ -0,0 +1,10 @@ +Name:Pyroclastic Hellion +ManaCost:4 R +Types:Creature Hellion +PT:4/5 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, you may return a land you control to its owner's hand. +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Hidden$ True | ChangeType$ Land.YouCtrl | ChangeNum$ 1 | SubAbility$ DBImmediateTrigger | RememberChanged$ True | SelectPrompt$ You may choose a land you control to return to its owner's hand +SVar:DBImmediateTrigger:DB$ ImmediateTrigger | RememberObjects$ RememberedCard | ConditionDefined$ Remembered | ConditionPresent$ Card | Execute$ TrigDamage | TriggerDescription$ When you do, CARDNAME deals 2 damage to each opponent. +SVar:TrigDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 2 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:When Pyroclastic Hellion enters the battlefield, you may return a land you control to its owner's hand. When you do, Pyroclastic Hellion deals 2 damage to each opponent. \ No newline at end of file From daf2380c6f0f67ebd1416a0b25416a0bc538765a Mon Sep 17 00:00:00 2001 From: paul_snoops Date: Thu, 17 Sep 2020 18:38:20 +0100 Subject: [PATCH 14/96] fix last line --- forge-gui/res/cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt index 818c3e14924..4da03ba978d 100644 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt @@ -7,4 +7,4 @@ SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | H SVar:DBImmediateTrigger:DB$ ImmediateTrigger | RememberObjects$ RememberedCard | ConditionDefined$ Remembered | ConditionPresent$ Card | Execute$ TrigDamage | TriggerDescription$ When you do, CARDNAME deals 2 damage to each opponent. SVar:TrigDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 2 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -Oracle:When Pyroclastic Hellion enters the battlefield, you may return a land you control to its owner's hand. When you do, Pyroclastic Hellion deals 2 damage to each opponent. \ No newline at end of file +Oracle:When Pyroclastic Hellion enters the battlefield, you may return a land you control to its owner's hand. When you do, Pyroclastic Hellion deals 2 damage to each opponent. From 4975c6a0c3033a2a4ce407d532d8a9c0df14b695 Mon Sep 17 00:00:00 2001 From: Alessandro Coli Date: Thu, 17 Sep 2020 18:50:22 +0200 Subject: [PATCH 15/96] First batch of implementations for the land popup Still to fix localization and ability to turn it on/off in the preferences --- .../forge/game/player/PlayerController.java | 30 +++-- .../src/main/java/forge/game/zone/Zone.java | 16 ++- .../java/forge/screens/match/CMatchUI.java | 126 +++++++++++++++--- .../main/java/forge/interfaces/IGuiGame.java | 12 +- .../java/forge/match/AbstractGuiGame.java | 10 +- .../forge/player/PlayerControllerHuman.java | 101 +++++++++++--- 6 files changed, 247 insertions(+), 48 deletions(-) diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index 8c8f7312410..2fb8eaf7d5f 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -1,8 +1,16 @@ package forge.game.player; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; + import com.google.common.base.Predicate; import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimap; + import forge.LobbyPlayer; import forge.card.ColorSet; import forge.card.ICardFace; @@ -14,7 +22,11 @@ import forge.game.GameEntity; import forge.game.GameObject; import forge.game.GameOutcome.AnteResult; import forge.game.GameType; -import forge.game.card.*; +import forge.game.card.Card; +import forge.game.card.CardCollection; +import forge.game.card.CardCollectionView; +import forge.game.card.CardView; +import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.cost.Cost; import forge.game.cost.CostPart; @@ -23,18 +35,17 @@ import forge.game.keyword.KeywordInterface; import forge.game.mana.Mana; import forge.game.mana.ManaConversionMatrix; import forge.game.replacement.ReplacementEffect; -import forge.game.spellability.*; +import forge.game.spellability.AbilitySub; +import forge.game.spellability.OptionalCostValue; +import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityStackInstance; +import forge.game.spellability.TargetChoices; import forge.game.trigger.WrappedAbility; +import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.item.PaperCard; import forge.util.ITriggerEvent; import forge.util.collect.FCollectionView; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.Collection; -import java.util.List; -import java.util.Map; /** * A prototype for player controller class @@ -278,4 +289,7 @@ public abstract class PlayerController { public abstract CardCollection chooseCardsForEffectMultiple(Map validMap, SpellAbility sa, String title, boolean isOptional); + + public void handleLandPlayed(Card land, Zone zone) { + } } diff --git a/forge-game/src/main/java/forge/game/zone/Zone.java b/forge-game/src/main/java/forge/game/zone/Zone.java index 9fe62acfc37..6f5088a34c6 100644 --- a/forge-game/src/main/java/forge/game/zone/Zone.java +++ b/forge-game/src/main/java/forge/game/zone/Zone.java @@ -28,6 +28,8 @@ import forge.game.card.CardUtil; import forge.game.event.EventValueChangeType; import forge.game.event.GameEventZone; import forge.game.player.Player; +import forge.game.player.PlayerCollection; +import forge.game.player.PlayerController; import forge.util.CollectionSuppliers; import forge.util.MyRandom; import forge.util.maps.EnumMapOfLists; @@ -124,7 +126,19 @@ public class Zone implements java.io.Serializable, Iterable { } onChanged(); game.fireEvent(new GameEventZone(zoneType, getPlayer(), EventValueChangeType.Added, c)); - } + + if(zoneType == ZoneType.Battlefield && c.isLand()) { + PlayerCollection playerCollection = game.getPlayers(); + int numPlayers = playerCollection.size(); + for (int i = 0; i < numPlayers; i++) { + Player player = playerCollection.get(i); + if(!player.isAI()) { + PlayerController playerControllerHuman = player.getController(); + playerControllerHuman.handleLandPlayed(c,this); + } + } + } + } public final boolean contains(final Card c) { return cardList.contains(c); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 4d17085fd6b..997d940fd73 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -17,11 +17,40 @@ */ package forge.screens.match; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.atomic.AtomicReference; + +import javax.swing.JMenu; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; + import com.google.common.base.Function; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; -import forge.*; + +import forge.FThreads; +import forge.GuiBase; +import forge.ImageCache; +import forge.LobbyPlayer; +import forge.Singletons; +import forge.StaticData; import forge.assets.FSkinProp; import forge.card.CardStateName; import forge.control.KeyboardShortcuts; @@ -42,11 +71,28 @@ import forge.game.keyword.Keyword; import forge.game.phase.PhaseType; import forge.game.player.DelayedReveal; import forge.game.player.IHasIcon; +import forge.game.player.Player; import forge.game.player.PlayerView; -import forge.game.spellability.*; +import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityStackInstance; +import forge.game.spellability.SpellAbilityView; +import forge.game.spellability.StackItemView; +import forge.game.spellability.TargetChoices; +import forge.game.zone.Zone; import forge.game.zone.ZoneType; -import forge.gui.*; -import forge.gui.framework.*; +import forge.gui.FNetOverlay; +import forge.gui.GuiChoose; +import forge.gui.GuiDialog; +import forge.gui.GuiUtils; +import forge.gui.SOverlayUtils; +import forge.gui.framework.DragCell; +import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; +import forge.gui.framework.ICDoc; +import forge.gui.framework.IVDoc; +import forge.gui.framework.SDisplayUtil; +import forge.gui.framework.SLayoutIO; +import forge.gui.framework.VEmptyDoc; import forge.item.InventoryItem; import forge.item.PaperCard; import forge.match.AbstractGuiGame; @@ -57,12 +103,23 @@ import forge.player.PlayerZoneUpdates; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; -import forge.screens.match.controllers.*; +import forge.screens.match.controllers.CAntes; +import forge.screens.match.controllers.CCombat; +import forge.screens.match.controllers.CDetailPicture; +import forge.screens.match.controllers.CDev; +import forge.screens.match.controllers.CDock; +import forge.screens.match.controllers.CLog; +import forge.screens.match.controllers.CPrompt; +import forge.screens.match.controllers.CStack; import forge.screens.match.menus.CMatchUIMenus; import forge.screens.match.views.VField; import forge.screens.match.views.VHand; -import forge.toolbox.*; +import forge.toolbox.FButton; +import forge.toolbox.FLabel; +import forge.toolbox.FOptionPane; +import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinImage; +import forge.toolbox.FTextArea; import forge.toolbox.imaging.FImagePanel; import forge.toolbox.imaging.FImagePanel.AutoSizeImageMode; import forge.toolbox.imaging.FImageUtil; @@ -79,17 +136,6 @@ import forge.view.arcane.CardPanel; import forge.view.arcane.FloatingZone; import net.miginfocom.swing.MigLayout; -import javax.swing.*; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; -import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.image.BufferedImage; -import java.util.*; -import java.util.List; -import java.util.Map.Entry; -import java.util.concurrent.atomic.AtomicReference; - /** * Constructs instance of match UI controller, used as a single point of * top-level control for child UIs. Tasks targeting the view of individual @@ -1392,4 +1438,50 @@ public final class CMatchUI nextNotifiableStackIndex--; } + @Override + public void handleLandPlayed(Card land, Zone zone) { + Runnable createPopupThread = new Runnable() { + @Override + public void run() { + createLandPopupPanel(land,zone); + } + }; + GuiBase.getInterface().invokeInEdtAndWait(createPopupThread); + } + + private void createLandPopupPanel(Card land, Zone zone) { + String title = "Forge"; + List options = ImmutableList.of(Localizer.getInstance().getMessage("lblOK")); + + MigLayout migLayout = new MigLayout("insets 15, left, gap 30, fill"); + JPanel mainPanel = new JPanel(migLayout); + final Dimension parentSize = JOptionPane.getRootFrame().getSize(); + Dimension maxSize = new Dimension(1400, parentSize.height - 100); + mainPanel.setMaximumSize(maxSize); + mainPanel.setOpaque(false); + + int rotation = getRotation(land.getView()); + + FImagePanel imagePanel = new FImagePanel(); + BufferedImage bufferedImage = FImageUtil.getImage(land.getCurrentState().getView()); + imagePanel.setImage(bufferedImage, rotation, AutoSizeImageMode.SOURCE); + int imageWidth = 433; + int imageHeight = 600; + Dimension imagePanelDimension = new Dimension(imageWidth,imageHeight); + imagePanel.setMinimumSize(imagePanelDimension); + + mainPanel.add(imagePanel, "cell 0 0, spany 3"); + + Player cardController = land.getController(); + String msg = cardController.toString() + " puts " + land.toString() + " into play into " + zone.toString() + "."; + + final FTextArea prompt1 = new FTextArea(msg); + prompt1.setFont(FSkin.getFont(21)); + prompt1.setAutoSize(true); + prompt1.setMinimumSize(new Dimension(475,200)); + mainPanel.add(prompt1, "cell 1 0, aligny top"); + + + FOptionPane.showOptionDialog(null, title, null, mainPanel, options); + } } diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java index 4f3ef7c081b..71251fab2ab 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java @@ -1,11 +1,17 @@ package forge.interfaces; +import java.util.Collection; +import java.util.List; +import java.util.Map; + import com.google.common.base.Function; + import forge.LobbyPlayer; import forge.assets.FSkinProp; import forge.deck.CardPool; import forge.game.GameEntityView; import forge.game.GameView; +import forge.game.card.Card; import forge.game.card.CardView; import forge.game.event.GameEventSpellAbilityCast; import forge.game.event.GameEventSpellRemovedFromStack; @@ -14,6 +20,7 @@ import forge.game.player.DelayedReveal; import forge.game.player.IHasIcon; import forge.game.player.PlayerView; import forge.game.spellability.SpellAbilityView; +import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.item.PaperCard; import forge.player.PlayerZoneUpdate; @@ -21,10 +28,6 @@ import forge.player.PlayerZoneUpdates; import forge.trackable.TrackableCollection; import forge.util.ITriggerEvent; -import java.util.Collection; -import java.util.List; -import java.util.Map; - public interface IGuiGame { void setGameView(GameView gameView); GameView getGameView(); @@ -51,6 +54,7 @@ public interface IGuiGame { void updateStack(); void notifyStackAddition(final GameEventSpellAbilityCast event); void notifyStackRemoval(final GameEventSpellRemovedFromStack event); + void handleLandPlayed(Card land, Zone zone); Iterable tempShowZones(PlayerView controller, Iterable zonesToUpdate); void hideZones(PlayerView controller, Iterable zonesToUpdate); void updateZones(Iterable zonesToUpdate); diff --git a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java index d2c762b7840..a626d36548f 100644 --- a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java +++ b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java @@ -9,8 +9,6 @@ import java.util.Set; import java.util.Timer; import java.util.TimerTask; -import forge.GuiBase; -import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; import com.google.common.collect.ImmutableList; @@ -20,13 +18,16 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import forge.FThreads; +import forge.GuiBase; import forge.assets.FSkinProp; import forge.game.GameView; +import forge.game.card.Card; import forge.game.card.CardView; import forge.game.card.CardView.CardStateView; import forge.game.event.GameEventSpellAbilityCast; import forge.game.event.GameEventSpellRemovedFromStack; import forge.game.player.PlayerView; +import forge.game.zone.Zone; import forge.interfaces.IGameController; import forge.interfaces.IGuiGame; import forge.interfaces.IMayViewCards; @@ -34,6 +35,7 @@ import forge.model.FModel; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; import forge.trackable.TrackableTypes; +import forge.util.Localizer; public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { private PlayerView currentPlayer = null; @@ -709,5 +711,9 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { public void notifyStackRemoval(GameEventSpellRemovedFromStack event) { } + @Override + public void handleLandPlayed(Card land, Zone zone) { + } + // End of Choice code } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 9606b476eb8..784840224a1 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1,9 +1,37 @@ package forge.player; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.commons.lang3.Range; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; + import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; -import com.google.common.collect.*; +import com.google.common.collect.Collections2; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.google.common.collect.ListMultimap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; + import forge.FThreads; import forge.GuiBase; import forge.LobbyPlayer; @@ -11,7 +39,11 @@ import forge.StaticData; import forge.achievement.AchievementCollection; import forge.ai.GameState; import forge.assets.FSkinProp; -import forge.card.*; +import forge.card.CardDb; +import forge.card.CardType; +import forge.card.ColorSet; +import forge.card.ICardFace; +import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostShard; import forge.control.FControlGamePlayback; @@ -19,12 +51,27 @@ import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; import forge.events.UiEventNextGameDecision; -import forge.game.*; +import forge.game.Game; +import forge.game.GameEntity; +import forge.game.GameEntityView; +import forge.game.GameEntityViewMap; +import forge.game.GameLogEntryType; +import forge.game.GameObject; +import forge.game.GameType; +import forge.game.PlanarDice; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityKey; import forge.game.ability.ApiType; import forge.game.ability.effects.CharmEffect; -import forge.game.card.*; +import forge.game.card.Card; +import forge.game.card.CardCollection; +import forge.game.card.CardCollectionView; +import forge.game.card.CardFaceView; +import forge.game.card.CardLists; +import forge.game.card.CardPredicates; +import forge.game.card.CardView; +import forge.game.card.CounterEnumType; +import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.cost.Cost; @@ -35,10 +82,20 @@ import forge.game.keyword.Keyword; import forge.game.keyword.KeywordInterface; import forge.game.mana.Mana; import forge.game.mana.ManaConversionMatrix; -import forge.game.player.*; +import forge.game.player.DelayedReveal; +import forge.game.player.Player; +import forge.game.player.PlayerActionConfirmMode; +import forge.game.player.PlayerController; +import forge.game.player.PlayerView; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementLayer; -import forge.game.spellability.*; +import forge.game.spellability.AbilityManaPart; +import forge.game.spellability.AbilitySub; +import forge.game.spellability.OptionalCostValue; +import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityStackInstance; +import forge.game.spellability.SpellAbilityView; +import forge.game.spellability.TargetChoices; import forge.game.trigger.Trigger; import forge.game.trigger.WrappedAbility; import forge.game.zone.MagicStack; @@ -52,28 +109,32 @@ import forge.interfaces.IMacroSystem; import forge.item.IPaperCard; import forge.item.PaperCard; import forge.match.NextGameDecision; -import forge.match.input.*; +import forge.match.input.Input; +import forge.match.input.InputAttack; +import forge.match.input.InputBlock; +import forge.match.input.InputConfirm; +import forge.match.input.InputConfirmMulligan; +import forge.match.input.InputLondonMulligan; +import forge.match.input.InputPassPriority; +import forge.match.input.InputPayMana; +import forge.match.input.InputProxy; +import forge.match.input.InputQueue; +import forge.match.input.InputSelectCardsForConvokeOrImprovise; +import forge.match.input.InputSelectCardsFromList; +import forge.match.input.InputSelectEntitiesFromList; import forge.model.FModel; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences.FPref; +import forge.util.CardTranslation; import forge.util.ITriggerEvent; import forge.util.Lang; import forge.util.Localizer; -import forge.util.CardTranslation; import forge.util.MessageUtil; import forge.util.TextUtil; import forge.util.collect.FCollection; import forge.util.collect.FCollectionView; import forge.util.gui.SOptionPane; import io.sentry.Sentry; -import org.apache.commons.lang3.Range; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import java.io.*; -import java.util.*; -import java.util.Map.Entry; /** * A prototype for player controller class @@ -3032,5 +3093,13 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } return result; } + + @Override + public void handleLandPlayed(Card land, Zone zone) { + IGuiGame guiGame = getGui(); + guiGame.handleLandPlayed(land,zone); + } + + } From 412f5a22efcdaed76db02bc2e43f6a9881bd7b34 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 15:33:00 -0400 Subject: [PATCH 16/96] valakut_exploration.txt --- .../upcoming/ZNR/valakut_exploration.txt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/valakut_exploration.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/valakut_exploration.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/valakut_exploration.txt new file mode 100755 index 00000000000..e006e2149b6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/valakut_exploration.txt @@ -0,0 +1,18 @@ +Name:Valakut Exploration +ManaCost:2 R +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, exile the top card of your library. You may play that card for as long as it remains exiled. +SVar:TrigExile:DB$ Dig | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True +S:Mode$ Continuous | MayPlay$ True | Affected$ Card.IsRemembered | AffectedZone$ Exile +T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget +SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigGraveyard | CheckSVar$ Y | SVarCompare$ GT0 | References$ Y | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your end step, if there are cards exiled with CARDNAME, put them into their owner's graveyard, then CARDNAME deals that much damage to each opponent. +SVar:TrigGraveyard:DB$ ChangeZoneAll | ChangeType$ Card.ExiledWithSource | Origin$ Exile | Destination$ Graveyard | RememberChanged$ True | SubAbility$ DBDamageAll +SVar:DBDamageAll:DB$ DamageAll | ValidPlayers$ Player.Opponent | NumDmg$ X | References$ X | SubAbility$ DBCleanup +SVar:X:Remembered$Amount +SVar:Y:Count$ValidExile Card.ExiledWithSource +SVar:BuffedBy:Land +DeckHas:Ability$Graveyard +Oracle:Landfall — Whenever a land enters the battlefield under your control, exile the top card of your library. You may play that card for as long as it remains exiled.\nAt the beginning of your end step, if there are cards exiled with Valakut Exploration, put them into their owner's graveyard, then Valakut Exploration deals that much damage to each opponent. From 02aa18820fbde76edaf528c85f749f8bb5e09a97 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 18:48:12 -0400 Subject: [PATCH 17/96] soul_shatter.txt fix Choices and StackDesc --- .../res/cardsfolder/upcoming/ZNR/soul_shatter.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/soul_shatter.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/soul_shatter.txt index c8f9baa8258..e15b44612a2 100755 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/soul_shatter.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/soul_shatter.txt @@ -1,11 +1,11 @@ Name:Soul Shatter ManaCost:2 B Types:Instant -A:SP$ RepeatEach | Cost$ 2 B | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ CreatureHighCMC | SubAbility$ DBSac | StackDescription$ SpellDescription | SpellDescription$ Each opponent sacrifices a creature or planeswalker with the highest converted mana cost among creatures and planeswalkers they control. -SVar:CreatureHighCMC:DB$ ChooseCard | ConditionCheckSVar$ X | ConditionSVarCompare$ GTY | Defined$ Player.IsRemembered | Choices$ Creature.YouCtrl+cmcEQX | ChoiceTitle$ Choose a creature with the highest converted mana cost to sacrifice | References$ X,Y | Mandatory$ True | RememberChosen$ True | SubAbility$ WalkerHighCMC -SVar:WalkerHighCMC:DB$ ChooseCard | ConditionCheckSVar$ Y | ConditionSVarCompare$ GTX | Defined$ Player.IsRemembered | Choices$ Planeswalker.YouCtrl+cmcEQY | ChoiceTitle$ Choose a planeswalker with the highest converted mana cost to sacrifice | References$ X,Y | Mandatory$ True | RememberChosen$ True | SubAbility$ TieCMC -SVar:TieCMC:DB$ ChooseCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQY | Defined$ Player.IsRemembered | Choices$ Creature.YouCtrl+cmcEQX,Planeswalker.YouCtrl+cmcEQX | ChoiceTitle$ Choose a creature or planeswalker with the highest converted mana cost to sacrifice | References$ X,Y | Mandatory$ True | RememberChosen$ True -SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup +A:SP$ RepeatEach | Cost$ 2 B | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ CreatureHighCMC | SubAbility$ DBSac | StackDescription$ Each opponent | SpellDescription$ Each opponent sacrifices a creature or planeswalker with the highest converted mana cost among creatures and planeswalkers they control. +SVar:CreatureHighCMC:DB$ ChooseCard | ConditionCheckSVar$ X | ConditionSVarCompare$ GTY | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl+cmcEQX | ChoiceTitle$ Choose a creature with the highest converted mana cost to sacrifice | References$ X,Y | Mandatory$ True | RememberChosen$ True | SubAbility$ WalkerHighCMC +SVar:WalkerHighCMC:DB$ ChooseCard | ConditionCheckSVar$ Y | ConditionSVarCompare$ GTX | Defined$ Player.IsRemembered | Choices$ Planeswalker.RememberedPlayerCtrl+cmcEQY | ChoiceTitle$ Choose a planeswalker with the highest converted mana cost to sacrifice | References$ X,Y | Mandatory$ True | RememberChosen$ True | SubAbility$ TieCMC +SVar:TieCMC:DB$ ChooseCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQY | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl+cmcEQX,Planeswalker.RememberedPlayerCtrl+cmcEQX | ChoiceTitle$ Choose a creature or planeswalker with the highest converted mana cost to sacrifice | References$ X,Y | Mandatory$ True | RememberChosen$ True +SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup | StackDescription$ sacrifices a creature or planeswalker with the highest converted mana cost among creatures and planeswalkers they control. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosen$ True SVar:X:Count$HighestCMC_Creature.RememberedPlayerCtrl+inZoneBattlefield SVar:Y:Count$HighestCMC_Planeswalker.RememberedPlayerCtrl+inZoneBattlefield From 5fcfcd2bd61d638e4d319865c6d47569b0226c6a Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 22:18:38 -0400 Subject: [PATCH 18/96] kazandu_mammoth_kazandu_valley.txt --- .../ZNR/kazandu_mammoth_kazandu_valley.txt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_mammoth_kazandu_valley.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_mammoth_kazandu_valley.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_mammoth_kazandu_valley.txt new file mode 100644 index 00000000000..ea79f09c19c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_mammoth_kazandu_valley.txt @@ -0,0 +1,18 @@ +Name:Kazandu Mammoth +ManaCost:1 G G +Types:Creature Elephant +PT:3/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, CARDNAME gets +2/+2 until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +2 | NumDef$ +2 +SVar:BuffedBy:Land +AlternateMode:Modal +Oracle:Landfall — Whenever a land enters the battlefield under your control, Kazandu Mammoth gets +2/+2 until end of turn. + +ALTERNATE + +Name:Kazandu Valley +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +Oracle:Kazandu Valley enters the battlefield tapped.\n{T}: Add {G}. From 6a3c0b6723ac2d19decab62bb1703982481d5c43 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 22:18:58 -0400 Subject: [PATCH 19/96] tangled_florahedron_tangled_vale.txt --- .../ZNR/tangled_florahedron_tangled_vale.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/tangled_florahedron_tangled_vale.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tangled_florahedron_tangled_vale.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/tangled_florahedron_tangled_vale.txt new file mode 100644 index 00000000000..fb04efc0d4b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/tangled_florahedron_tangled_vale.txt @@ -0,0 +1,16 @@ +Name:Tangled Florahedron +ManaCost:1 G +Types:Creature Elemental +PT:1/1 +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +AlternateMode:Modal +Oracle:{T}: Add {G}. + +ALTERNATE + +Name:Tangled Vale +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +Oracle:Tangled Vale enters the battlefield tapped.\n{T}: Add {G}. From f0dd0e3228f8f4adff0fcbcf2b9ca66157fcd657 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 17 Sep 2020 22:19:55 -0400 Subject: [PATCH 20/96] vastwood_fortification_vastwood_thicket.txt --- .../vastwood_fortification_vastwood_thicket.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/vastwood_fortification_vastwood_thicket.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/vastwood_fortification_vastwood_thicket.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/vastwood_fortification_vastwood_thicket.txt new file mode 100644 index 00000000000..a4307ac3a88 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/vastwood_fortification_vastwood_thicket.txt @@ -0,0 +1,16 @@ +Name:Vastwood Fortification +ManaCost:G +Types:Instant +A:SP$ PutCounter | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. +DeckHas:Ability$Counters +AlternateMode:Modal +Oracle:Put a +1/+1 counter on target creature. + +ALTERNATE + +Name:Vastwood Thicket +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +Oracle:Vastwood Thicket enters the battlefield tapped.\n{T}: Add {G}. From 8fd9c74b1443cf8a4bb640528d833bd56aadec51 Mon Sep 17 00:00:00 2001 From: paul_snoops Date: Fri, 18 Sep 2020 15:31:54 +0100 Subject: [PATCH 21/96] Some ZNR cards --- .../res/cardsfolder/upcoming/ZNR/spare_supplies.txt | 8 ++++++++ .../res/cardsfolder/upcoming/ZNR/springmantle_cleric.txt | 8 ++++++++ .../cardsfolder/upcoming/ZNR/territorial_scythecat.txt | 9 +++++++++ .../res/cardsfolder/upcoming/ZNR/turntimber_ascetic.txt | 7 +++++++ 4 files changed, 32 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/spare_supplies.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/springmantle_cleric.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_ascetic.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/spare_supplies.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/spare_supplies.txt new file mode 100644 index 00000000000..e7c457c32d3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/spare_supplies.txt @@ -0,0 +1,8 @@ +Name:Spare Supplies +ManaCost:2 +Types:Artifact +K:CARDNAME enters the battlefield tapped. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +A:AB$ Draw | Cost$ 2 T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. +Oracle:Spare Supplies enters the battlefield tapped.\nWhen Spare Supplies enters the battlefield, draw a card.\n{2}, {T}, Sacrifice Spare Supplies: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/springmantle_cleric.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/springmantle_cleric.txt new file mode 100644 index 00000000000..a181994b9e5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/springmantle_cleric.txt @@ -0,0 +1,8 @@ +Name:Springmantle Cleric +ManaCost:4 G +Types:Creature Elf Cleric +PT:2/3 +K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. +SVar:X:Count$Converge +DeckHas:Ability$Counters +Oracle:Springmantle Cleric enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt new file mode 100644 index 00000000000..5fca50771d9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt @@ -0,0 +1,9 @@ +Name:Territorial Scythecat +ManaCost:2 G +Types:Creature Cat +PT:2/1 +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:BuffedBy:Land +Oracle:Trample\nLandfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on Territorial Scythecat. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_ascetic.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_ascetic.txt new file mode 100644 index 00000000000..c5dd5613c3c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_ascetic.txt @@ -0,0 +1,7 @@ +Name:Turntimber Ascetic +ManaCost:4 G +Types:Creature Giant Cleric +PT:5/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 3 life. +SVar:TrigGainLife:DB$GainLife | LifeAmount$ 3 +Oracle:When Turntimber Ascetic enters the battlefield, you gain 3 life. From 4b82152856ccafc0fb5eb54c3e520c211189315a Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 18 Sep 2020 11:54:18 -0400 Subject: [PATCH 22/96] hallar_the_firefletcher.txt add BuffedBy --- forge-gui/res/cardsfolder/h/hallar_the_firefletcher.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/h/hallar_the_firefletcher.txt b/forge-gui/res/cardsfolder/h/hallar_the_firefletcher.txt index 5502804bb49..c56437aa153 100644 --- a/forge-gui/res/cardsfolder/h/hallar_the_firefletcher.txt +++ b/forge-gui/res/cardsfolder/h/hallar_the_firefletcher.txt @@ -8,5 +8,5 @@ SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNu SVar:DBDealDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ X | References$ X SVar:X:Count$CardCounters.P1P1 DeckHas:Ability$Counters -SVar:Picture:http://www.wizards.com/global/images/magic/general/hallar_the_firefletcher.jpg +SVar:BuffedBy:Card.withKicker,Card.withMultikicker Oracle:Trample\nWhenever you cast a spell, if that spell was kicked, put a +1/+1 counter on Hallar, the Firefletcher, then Hallar deals damage equal to the number of +1/+1 counters on it to each opponent. From a394e83c4903b5eb0c7729dcf00f410bec72c1ca Mon Sep 17 00:00:00 2001 From: paul_snoops Date: Fri, 18 Sep 2020 17:23:03 +0100 Subject: [PATCH 23/96] fixes --- forge-gui/res/cardsfolder/upcoming/ZNR/spare_supplies.txt | 1 + .../res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt | 1 + forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_ascetic.txt | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/spare_supplies.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/spare_supplies.txt index e7c457c32d3..0c95ab7c428 100644 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/spare_supplies.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/spare_supplies.txt @@ -5,4 +5,5 @@ K:CARDNAME enters the battlefield tapped. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 A:AB$ Draw | Cost$ 2 T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. +DeckHas:Ability$Sacrifice Oracle:Spare Supplies enters the battlefield tapped.\nWhen Spare Supplies enters the battlefield, draw a card.\n{2}, {T}, Sacrifice Spare Supplies: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt index 5fca50771d9..f72a1c19d24 100644 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt @@ -6,4 +6,5 @@ K:Trample T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 SVar:BuffedBy:Land +DeckHas:Ability$Counters Oracle:Trample\nLandfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on Territorial Scythecat. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_ascetic.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_ascetic.txt index c5dd5613c3c..bd47187f883 100644 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_ascetic.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_ascetic.txt @@ -3,5 +3,6 @@ ManaCost:4 G Types:Creature Giant Cleric PT:5/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 3 life. -SVar:TrigGainLife:DB$GainLife | LifeAmount$ 3 +SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 3 +DeckHas:Ability$LifeGain Oracle:When Turntimber Ascetic enters the battlefield, you gain 3 life. From caa1549078db15f3c060ae75c65826f5d6e47025 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 18 Sep 2020 12:33:53 -0400 Subject: [PATCH 24/96] Remove TriggerZone$ Battlefield from some "when CARDNAME dies" triggers --- forge-gui/res/cardsfolder/b/basris_lieutenant.txt | 2 +- forge-gui/res/cardsfolder/o/omnath_locus_of_rage.txt | 5 ++--- .../cardsfolder/upcoming/ZNR/orah_skyclave_hierophant.txt | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/b/basris_lieutenant.txt b/forge-gui/res/cardsfolder/b/basris_lieutenant.txt index f8e90baf2d8..5699bb655e2 100755 --- a/forge-gui/res/cardsfolder/b/basris_lieutenant.txt +++ b/forge-gui/res/cardsfolder/b/basris_lieutenant.txt @@ -6,7 +6,7 @@ K:Vigilance K:Protection from multicolored T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, put a +1/+1 counter on target creature you control. SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+counters_GE1_P1P1 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerController$ TriggeredCardController | TriggerDescription$ Whenever CARDNAME or another creature you control dies, if it had a +1/+1 counter on it, create a 2/2 white Knight creature token with vigilance. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+counters_GE1_P1P1 | Execute$ TrigToken | TriggerController$ TriggeredCardController | TriggerDescription$ Whenever CARDNAME or another creature you control dies, if it had a +1/+1 counter on it, create a 2/2 white Knight creature token with vigilance. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other+YouCtrl+counters_GE1_P1P1 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerController$ TriggeredCardController | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another creature you control dies, if it had a +1/+1 counter on it, create a 2/2 white Knight creature token with vigilance. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_2_2_knight_vigilance | TokenOwner$ You DeckHas:Ability$Counters & Ability$Token diff --git a/forge-gui/res/cardsfolder/o/omnath_locus_of_rage.txt b/forge-gui/res/cardsfolder/o/omnath_locus_of_rage.txt index 957451b3abb..7ba753e9a0b 100644 --- a/forge-gui/res/cardsfolder/o/omnath_locus_of_rage.txt +++ b/forge-gui/res/cardsfolder/o/omnath_locus_of_rage.txt @@ -4,8 +4,7 @@ Types:Legendary Creature Elemental PT:5/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, create a 5/5 red and green Elemental creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ rg_5_5_elemental | TokenOwner$ You | LegacyImage$ rg 5 5 elemental -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerController$ TriggeredCardController | TriggerDescription$ Whenever CARDNAME or another Elemental you control dies, CARDNAME deals 3 damage to any target. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerController$ TriggeredCardController | TriggerDescription$ Whenever CARDNAME or another Elemental you control dies, CARDNAME deals 3 damage to any target. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Elemental.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerController$ TriggeredCardController | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Elemental you control dies, CARDNAME deals 3 damage to any target. SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 -SVar:Picture:http://www.wizards.com/global/images/magic/general/omnath_locus_of_rage.jpg -Oracle:Landfall — Whenever a land enters the battlefield under your control, create a 5/5 red and green Elemental creature token.\nWhenever Omnath, Locus of Rage or another Elemental you control dies, Omnath deals 3 damage to any target. \ No newline at end of file +Oracle:Landfall — Whenever a land enters the battlefield under your control, create a 5/5 red and green Elemental creature token.\nWhenever Omnath, Locus of Rage or another Elemental you control dies, Omnath deals 3 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/orah_skyclave_hierophant.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/orah_skyclave_hierophant.txt index c760412568b..f12bb686902 100755 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/orah_skyclave_hierophant.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/orah_skyclave_hierophant.txt @@ -3,7 +3,7 @@ ManaCost:2 W B Types:Legendary Creature Kor Cleric PT:3/3 K:Lifelink -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZone$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ Whenever CARDNAME or another Cleric you control dies, return target Cleric with lesser converted mana cost from your graveyard to the battlefield. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ Whenever CARDNAME or another Cleric you control dies, return target Cleric with lesser converted mana cost from your graveyard to the battlefield. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZone$ Battlefield | ValidCard$ Cleric.YouCtrl+Other | Execute$ TrigReturn | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Cleric you control dies, return target Cleric card with lesser converted mana cost from your graveyard to the battlefield. SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Cleric.cmcLTX+YouOwn | TgtPrompt$ Choose target Cleric card with lesser converted mana cost | References$ X | Origin$ Graveyard | Destination$ Battlefield SVar:X:TriggeredCard$CardManaCost From 0e70a4c9736dd1fee62d1f4dac67bb593edfd625 Mon Sep 17 00:00:00 2001 From: paul_snoops Date: Fri, 18 Sep 2020 17:44:49 +0100 Subject: [PATCH 25/96] fixes --- .../res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt index f72a1c19d24..4e60e7a54f9 100644 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt @@ -4,7 +4,7 @@ Types:Creature Cat PT:2/1 K:Trample T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 SVar:BuffedBy:Land DeckHas:Ability$Counters Oracle:Trample\nLandfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on Territorial Scythecat. From 8d24a2a6ff85ae5bdbc8903b874bfa56d1c36bec Mon Sep 17 00:00:00 2001 From: Alessandro Coli Date: Sat, 19 Sep 2020 13:39:22 +0200 Subject: [PATCH 26/96] Introduced a preference to turn the panel on/off. --- .../home/settings/CSubmenuPreferences.java | 13 +++- .../home/settings/VSubmenuPreferences.java | 8 +++ .../java/forge/screens/match/CMatchUI.java | 66 ++++++++++--------- forge-gui/res/languages/en-US.properties | 4 +- .../java/forge/properties/ForgeConstants.java | 5 ++ .../forge/properties/ForgePreferences.java | 1 + 6 files changed, 64 insertions(+), 33 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java index 7ecf07dc642..69dbdb79ae7 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java @@ -246,6 +246,7 @@ public enum CSubmenuPreferences implements ICDoc { initializeMulliganRuleComboBox(); initializeAiProfilesComboBox(); initializeStackAdditionsComboBox(); + initializeLandPlayedComboBox(); initializeColorIdentityCombobox(); initializeAutoYieldModeComboBox(); initializeCounterDisplayTypeComboBox(); @@ -447,7 +448,17 @@ public enum CSubmenuPreferences implements ICDoc { final String selectedItem = this.prefs.getPref(userSetting); panel.setComboBox(comboBox, selectedItem); } - + + private void initializeLandPlayedComboBox() { + final String[] elems = {ForgeConstants.LAND_PLAYED_NOTIFICATION_NEVER, ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS, + ForgeConstants.LAND_PLAYED_NOTIFICATION_AI}; + final FPref userSetting = FPref.UI_LAND_PLAYED_NOTIFICATION_POLICY; + final FComboBoxPanel panel = this.view.getCbpLandPlayedComboBoxPanel(); + final FComboBox comboBox = createComboBox(elems, userSetting); + final String selectedItem = this.prefs.getPref(userSetting); + panel.setComboBox(comboBox, selectedItem); + } + private void initializeColorIdentityCombobox() { final String[] elems = {ForgeConstants.DISP_CURRENT_COLORS_NEVER, ForgeConstants.DISP_CURRENT_COLORS_CHANGED, ForgeConstants.DISP_CURRENT_COLORS_MULTICOLOR, ForgeConstants.DISP_CURRENT_COLORS_MULTI_OR_CHANGED, diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java index 103a046b3fd..352d1a69a60 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java @@ -120,6 +120,7 @@ public enum VSubmenuPreferences implements IVSubmenu { private final FComboBoxPanel cbpMulliganRule = new FComboBoxPanel<>(localizer.getMessage("cbpMulliganRule")+":"); private final FComboBoxPanel cbpAiProfiles = new FComboBoxPanel<>(localizer.getMessage("cbpAiProfiles")+":"); private final FComboBoxPanel cbpStackAdditions = new FComboBoxPanel<>(localizer.getMessage("cbpStackAdditions")+":"); + private final FComboBoxPanel cbpLandPlayed = new FComboBoxPanel<>(localizer.getMessage("cbpLandPlayed")+":"); private final FComboBoxPanel cbpDisplayCurrentCardColors = new FComboBoxPanel<>(localizer.getMessage("cbpDisplayCurrentCardColors")+":"); private final FComboBoxPanel cbpAutoYieldMode = new FComboBoxPanel<>(localizer.getMessage("cbpAutoYieldMode")+":"); private final FComboBoxPanel cbpCounterDisplayType = new FComboBoxPanel<>(localizer.getMessage("cbpCounterDisplayType")+":"); @@ -205,6 +206,9 @@ public enum VSubmenuPreferences implements IVSubmenu { pnlPrefs.add(cbpStackAdditions, comboBoxConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlpStackAdditions")), descriptionConstraints); + + pnlPrefs.add(cbpLandPlayed, comboBoxConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlpLandPlayed")), descriptionConstraints); pnlPrefs.add(cbEnforceDeckLegality, titleConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnforceDeckLegality")), descriptionConstraints); @@ -684,6 +688,10 @@ public enum VSubmenuPreferences implements IVSubmenu { public FComboBoxPanel getCbpStackAdditionsComboBoxPanel() { return cbpStackAdditions; } + + public FComboBoxPanel getCbpLandPlayedComboBoxPanel() { + return cbpLandPlayed; + } public FComboBoxPanel getGameLogVerbosityComboBoxPanel() { return cbpGameLogEntryType; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 997d940fd73..518b93ce7ed 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -1450,38 +1450,42 @@ public final class CMatchUI } private void createLandPopupPanel(Card land, Zone zone) { - String title = "Forge"; - List options = ImmutableList.of(Localizer.getInstance().getMessage("lblOK")); - MigLayout migLayout = new MigLayout("insets 15, left, gap 30, fill"); - JPanel mainPanel = new JPanel(migLayout); - final Dimension parentSize = JOptionPane.getRootFrame().getSize(); - Dimension maxSize = new Dimension(1400, parentSize.height - 100); - mainPanel.setMaximumSize(maxSize); - mainPanel.setOpaque(false); - - int rotation = getRotation(land.getView()); + String landPlayedNotificationPolicy = FModel.getPreferences().getPref(FPref.UI_LAND_PLAYED_NOTIFICATION_POLICY); + Player cardController = land.getController(); + boolean isAi = cardController.isAI(); + if(ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS.equals(landPlayedNotificationPolicy) || (ForgeConstants.LAND_PLAYED_NOTIFICATION_AI.equals(landPlayedNotificationPolicy) && (isAi))) { + String title = "Forge"; + List options = ImmutableList.of(Localizer.getInstance().getMessage("lblOK")); + + MigLayout migLayout = new MigLayout("insets 15, left, gap 30, fill"); + JPanel mainPanel = new JPanel(migLayout); + final Dimension parentSize = JOptionPane.getRootFrame().getSize(); + Dimension maxSize = new Dimension(1400, parentSize.height - 100); + mainPanel.setMaximumSize(maxSize); + mainPanel.setOpaque(false); + + int rotation = getRotation(land.getView()); - FImagePanel imagePanel = new FImagePanel(); - BufferedImage bufferedImage = FImageUtil.getImage(land.getCurrentState().getView()); - imagePanel.setImage(bufferedImage, rotation, AutoSizeImageMode.SOURCE); - int imageWidth = 433; - int imageHeight = 600; - Dimension imagePanelDimension = new Dimension(imageWidth,imageHeight); - imagePanel.setMinimumSize(imagePanelDimension); - - mainPanel.add(imagePanel, "cell 0 0, spany 3"); - - Player cardController = land.getController(); - String msg = cardController.toString() + " puts " + land.toString() + " into play into " + zone.toString() + "."; - - final FTextArea prompt1 = new FTextArea(msg); - prompt1.setFont(FSkin.getFont(21)); - prompt1.setAutoSize(true); - prompt1.setMinimumSize(new Dimension(475,200)); - mainPanel.add(prompt1, "cell 1 0, aligny top"); - - - FOptionPane.showOptionDialog(null, title, null, mainPanel, options); + FImagePanel imagePanel = new FImagePanel(); + BufferedImage bufferedImage = FImageUtil.getImage(land.getCurrentState().getView()); + imagePanel.setImage(bufferedImage, rotation, AutoSizeImageMode.SOURCE); + int imageWidth = 433; + int imageHeight = 600; + Dimension imagePanelDimension = new Dimension(imageWidth,imageHeight); + imagePanel.setMinimumSize(imagePanelDimension); + + mainPanel.add(imagePanel, "cell 0 0, spany 3"); + + String msg = cardController.toString() + " puts " + land.toString() + " into play into " + zone.toString() + "."; + + final FTextArea prompt1 = new FTextArea(msg); + prompt1.setFont(FSkin.getFont(21)); + prompt1.setAutoSize(true); + prompt1.setMinimumSize(new Dimension(475,200)); + mainPanel.add(prompt1, "cell 1 0, aligny top"); + + FOptionPane.showOptionDialog(null, title, null, mainPanel, options); + } } } diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 7c1cc2d7adc..ea286757045 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -2583,4 +2583,6 @@ lblEnterMessageToSend=Enter message to send #OnlineLobbyScreen.java lblDetectedInvalidHostAddress=Invalid host address ({0}) was detected. #Player.java -lblChooseACompanion=Choose a companion \ No newline at end of file +lblChooseACompanion=Choose a companion +cbpLandPlayed=Land entering battlefield notifications +nlpLandPlayed=Choose when you want to get visual notifications for a land entering the battlefield: Never, always, or only for the lands entering a battlefield because of an action of a AI player diff --git a/forge-gui/src/main/java/forge/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/properties/ForgeConstants.java index eedfa484152..809d4e823d1 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/properties/ForgeConstants.java @@ -321,6 +321,11 @@ public final class ForgeConstants { public static final String STACK_EFFECT_NOTIFICATION_NEVER = "Never"; public static final String STACK_EFFECT_NOTIFICATION_ALWAYS = "Always"; public static final String STACK_EFFECT_NOTIFICATION_AI_AND_TRIGGERED = "AI cast/activated, or triggered by any player"; + + // Constants for LAnd played notification policy + public static final String LAND_PLAYED_NOTIFICATION_NEVER = "Never"; + public static final String LAND_PLAYED_NOTIFICATION_ALWAYS = "Always"; + public static final String LAND_PLAYED_NOTIFICATION_AI = "Lands entering a battlefield because of an action of a AI player"; // Set boolean constant for landscape mode for gdx port public static final boolean isGdxPortLandscape = FileUtil.doesFileExist(ASSETS_DIR + "switch_orientation.ini"); diff --git a/forge-gui/src/main/java/forge/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/properties/ForgePreferences.java index fa49f465f71..679b2922e96 100644 --- a/forge-gui/src/main/java/forge/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/properties/ForgePreferences.java @@ -121,6 +121,7 @@ public class ForgePreferences extends PreferencesStore { UI_CLOSE_ACTION ("NONE"), UI_MANA_LOST_PROMPT ("false"), // Prompt on losing mana when passing priority UI_STACK_EFFECT_NOTIFICATION_POLICY ("Never"), + UI_LAND_PLAYED_NOTIFICATION_POLICY ("Never"), UI_PAUSE_WHILE_MINIMIZED("false"), UI_TOKENS_IN_SEPARATE_ROW("false"), // Display tokens in their own battlefield row. UI_DISPLAY_CURRENT_COLORS(ForgeConstants.DISP_CURRENT_COLORS_NEVER), From 99a715e457a43e52a702a93331c318d5d0ac1861 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 19 Sep 2020 19:26:50 -0400 Subject: [PATCH 27/96] azorius_justiciar.txt add AILogic ? --- forge-gui/res/cardsfolder/a/azorius_justiciar.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/azorius_justiciar.txt b/forge-gui/res/cardsfolder/a/azorius_justiciar.txt index 3cf3a514976..87cca6176bd 100644 --- a/forge-gui/res/cardsfolder/a/azorius_justiciar.txt +++ b/forge-gui/res/cardsfolder/a/azorius_justiciar.txt @@ -3,7 +3,6 @@ ManaCost:2 W W Types:Creature Human Wizard PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ Detain | TriggerDescription$ When CARDNAME enters the battlefield, detain up to two target creatures your opponents control. (Until your next turn, those creatures can't attack or block and their activated abilities can't be activated.) -SVar:Detain:DB$ Pump | TargetMin$ 0 | TargetMax$ 2 | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. +SVar:Detain:DB$ Pump | TargetMin$ 0 | TargetMax$ 2 | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. | AILogic$ DetainNonLand SVar:PlayMain1:TRUE -SVar:Picture:http://www.wizards.com/global/images/magic/general/azorius_justiciar.jpg Oracle:When Azorius Justiciar enters the battlefield, detain up to two target creatures your opponents control. (Until your next turn, those creatures can't attack or block and their activated abilities can't be activated.) From 901deed1e9c00fbffd212a3d4b017cd401da3674 Mon Sep 17 00:00:00 2001 From: paul_snoops Date: Sun, 20 Sep 2020 10:11:05 +0100 Subject: [PATCH 28/96] x6 ZNR cards --- forge-gui/res/cardsfolder/upcoming/ZNR/base_camp.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/ZNR/sea_gate_colossus.txt | 9 +++++++++ .../cardsfolder/upcoming/ZNR/stonework_packbeast.txt | 8 ++++++++ .../res/cardsfolder/upcoming/ZNR/throne_of_makindi.txt | 7 +++++++ .../res/cardsfolder/upcoming/ZNR/utility_knife.txt | 9 +++++++++ 6 files changed, 52 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/base_camp.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_colossus.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/stonework_packbeast.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/throne_of_makindi.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/utility_knife.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/base_camp.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/base_camp.txt new file mode 100644 index 00000000000..75aa8cb9624 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/base_camp.txt @@ -0,0 +1,9 @@ +Name:Base Camp +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +A:AB$ Mana | Cost$ T | Produced$ Any | RestrictValid$ Cleric,Rogue,Warrior,Wizard | SpellDescription$ Add one mana of any color. Spend this mana only to cast a Cleric, Rogue, Warrior, or Wizard spell or to activate an ability of a Cleric, Rogue, Warrior, or Wizard. +DeckHas:Ability$Party +DeckHints:Type$Cleric|Rogue|Warrior|Wizard +Oracle:Base Camp enters the battlefield tapped.\n{T}: Add {C}.\n{T}: Add one mana of any color. Spend this mana only to cast a Cleric, Rogue, Warrior, or Wizard spell or to activate an ability of a Cleric, Rogue, Warrior, or Wizard. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt new file mode 100644 index 00000000000..434ae65e3f2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt @@ -0,0 +1,10 @@ +Name:Relic Vial +ManaCost:3 +Types:Artifact +A:AB$ Draw | Cost$ 2 T Sac<1/Creature> | NumCards$ 1 | SpellDescription$ Draw a card. +S:Mode$ Continuous | Affected$ Card.Self | AddTrigger$ TrigDrain | IsPresent$ Cleric.YouCtrl | Description$ As long as you control a Cleric, CARDNAME has "Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life." +SVar:TrigDrain:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life. +SVar:TrigLoseLife:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +DeckHints:Type$Cleric +Oracle:{2}, {T}, Sacrifice a creature: Draw a card.\nAs long as you control a Cleric, Relic Vial has "Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life." diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_colossus.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_colossus.txt new file mode 100644 index 00000000000..a5ae88f9f84 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_colossus.txt @@ -0,0 +1,9 @@ +Name:Sea Gate Colossus +ManaCost:7 +Types:Artifact Creature Golem Warrior +PT:7/5 +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ This spell costs {1} less to cast for each creature in your party. +SVar:X:Count$Party +DeckHas:Ability$Party +DeckHints:Type$Cleric|Rogue|Warrior|Wizard +Oracle:This spell costs {1} less to cast for each creature in your party. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/stonework_packbeast.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/stonework_packbeast.txt new file mode 100644 index 00000000000..3f05aded909 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/stonework_packbeast.txt @@ -0,0 +1,8 @@ +Name:Stonework Packbeast +ManaCost:2 +Types:Artifact Creature Beast +PT:2/1 +S:Mode$ Continuous | EffectZone$ All | Affected$ Card.Self | CharacteristicDefining$ True | AddType$ Cleric & Rogue & Warrior & Wizard | Description$ CARDNAME is also a Cleric, Rogue, Warrior, and Wizard. +A:AB$ Mana | Cost$ 2 | Produced$ Any | SpellDescription$ Add one mana of any color. +DeckHints:Ability$Party +Oracle:Stonework Packbeast is also a Cleric, Rogue, Warrior, and Wizard.\n{2}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/throne_of_makindi.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/throne_of_makindi.txt new file mode 100644 index 00000000000..ca694f4bdd6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/throne_of_makindi.txt @@ -0,0 +1,7 @@ +Name:Throne of Makindi +ManaCost:no cost +Types:Land +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +A:AB$ PutCounter | Cost$ 1 T | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. +A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ Any | Amount$ 2 | RestrictValid$ Spell.Kicked | SpellDescription$ Add two mana of any one color. Spend this mana only to cast kicked spells. +Oracle:{T}: Add {C}.\n{1}, {T}: Put a charge counter on Throne of Makindi.\n{T}, Remove a charge counter from Throne of Makindi: Add two mana of any one color. Spend this mana only to cast kicked spells. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/utility_knife.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/utility_knife.txt new file mode 100644 index 00000000000..772cec9e156 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/utility_knife.txt @@ -0,0 +1,9 @@ +Name:Utility Knife +ManaCost:1 +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When CARDNAME enters the battlefield, attach it to target creature you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control +SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Equipped creature gets +1/+1. +K:Equip:3 +Oracle:When Utility Knife enters the battlefield, attach it to target creature you control.\nEquipped creature gets +1/+1.\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) From 2ec2c5ca493e42a9185f2e2fd932ecfa4857658b Mon Sep 17 00:00:00 2001 From: paul_snoops Date: Sun, 20 Sep 2020 12:44:54 +0100 Subject: [PATCH 29/96] fix for Relic Vial --- forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt index 434ae65e3f2..ce7d0033f04 100644 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt @@ -6,5 +6,6 @@ S:Mode$ Continuous | Affected$ Card.Self | AddTrigger$ TrigDrain | IsPresent$ Cl SVar:TrigDrain:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life. SVar:TrigLoseLife:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 -DeckHints:Type$Cleric +DeckHas:Ability$Sacrifice +DeckNeeds:Type$Cleric Oracle:{2}, {T}, Sacrifice a creature: Draw a card.\nAs long as you control a Cleric, Relic Vial has "Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life." From 475c97a15d6bf30da6b2a6d50b286893b822077e Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 20 Sep 2020 08:19:04 -0400 Subject: [PATCH 30/96] omnath_locus_of_creation.txt tweak for multiple triggers at once --- .../upcoming/ZNR/omnath_locus_of_creation.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/omnath_locus_of_creation.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/omnath_locus_of_creation.txt index 2a42805e30d..ae3a4d29eda 100644 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/omnath_locus_of_creation.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/omnath_locus_of_creation.txt @@ -7,11 +7,11 @@ SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ LandfallReset | Static$ True T:Mode$ TurnBegin | ValidPlayer$ Player | Static$ True | TriggerZones$ Battlefield | Execute$ LandfallReset SVar:LandfallReset:DB$ StoreSVar | SVar$ LandfallAmount | Type$ Number | Expression$ 0 | References$ LandfallAmount -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you gain 4 life if this is the first time this ability has resolved this turn. If it's the second time, add {R}{G}{W}{U}. If it's the third time, CARDNAME deals 4 damage to each opponent and each planeswalker you don't control. -SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 4 | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ0 | SubAbility$ DBMana -SVar:DBMana:DB$ Mana | Produced$ R G W U | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ1 | SubAbility$ DBDamageAll -SVar:DBDamageAll:DB$ DamageAll | ValidPlayers$ Opponent | ValidCards$ Planeswalker.YouDontCtrl | NumDmg$ 4 | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ2 | SubAbility$ LandfallCount -SVar:LandfallCount:DB$ StoreSVar | SVar$ LandfallAmount | Type$ CountSVar | Expression$ LandfallAmount/Plus.1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLandfallCount | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you gain 4 life if this is the first time this ability has resolved this turn. If it's the second time, add {R}{G}{W}{U}. If it's the third time, CARDNAME deals 4 damage to each opponent and each planeswalker you don't control. +SVar:TrigLandfallCount:DB$ StoreSVar | SVar$ LandfallAmount | Type$ CountSVar | SubAbility$ DBGainLife | Expression$ LandfallAmount/Plus.1 +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 4 | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ1 | SubAbility$ DBMana +SVar:DBMana:DB$ Mana | Produced$ R G W U | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ2 | SubAbility$ DBDamageAll +SVar:DBDamageAll:DB$ DamageAll | ValidPlayers$ Opponent | ValidCards$ Planeswalker.YouDontCtrl | NumDmg$ 4 | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ3 | SubAbility$ LandfallCount SVar:LandfallAmount:Number$0 DeckHas:Ability$LifeGain Oracle:When Omnath, Locus of Creation enters the battlefield, draw a card.\nLandfall - Whenever a land enters the battlefield under your control, you gain 4 life if this is the first time this ability has resolved this turn. If it's the second time, add {R}{G}{W}{U}. If it's the third time, Omnath deals 4 damage to each opponent and each planeswalker you don't control. From 238ea3b1ec785103a54cda4775d31252f02b3cfd Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 20 Sep 2020 08:35:30 -0400 Subject: [PATCH 31/96] - remove unneeded SubAbility --- .../res/cardsfolder/upcoming/ZNR/omnath_locus_of_creation.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/omnath_locus_of_creation.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/omnath_locus_of_creation.txt index ae3a4d29eda..4f45181a378 100644 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/omnath_locus_of_creation.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/omnath_locus_of_creation.txt @@ -11,7 +11,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.Y SVar:TrigLandfallCount:DB$ StoreSVar | SVar$ LandfallAmount | Type$ CountSVar | SubAbility$ DBGainLife | Expression$ LandfallAmount/Plus.1 SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 4 | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ1 | SubAbility$ DBMana SVar:DBMana:DB$ Mana | Produced$ R G W U | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ2 | SubAbility$ DBDamageAll -SVar:DBDamageAll:DB$ DamageAll | ValidPlayers$ Opponent | ValidCards$ Planeswalker.YouDontCtrl | NumDmg$ 4 | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ3 | SubAbility$ LandfallCount +SVar:DBDamageAll:DB$ DamageAll | ValidPlayers$ Opponent | ValidCards$ Planeswalker.YouDontCtrl | NumDmg$ 4 | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ3 SVar:LandfallAmount:Number$0 DeckHas:Ability$LifeGain Oracle:When Omnath, Locus of Creation enters the battlefield, draw a card.\nLandfall - Whenever a land enters the battlefield under your control, you gain 4 life if this is the first time this ability has resolved this turn. If it's the second time, add {R}{G}{W}{U}. If it's the third time, Omnath deals 4 damage to each opponent and each planeswalker you don't control. From 6e7dba284d091a312fb2289be18bd09f6fc6cca6 Mon Sep 17 00:00:00 2001 From: paul_snoops Date: Sun, 20 Sep 2020 16:13:46 +0100 Subject: [PATCH 32/96] fixes --- forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt | 2 +- forge-gui/res/cardsfolder/upcoming/ZNR/throne_of_makindi.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt index ce7d0033f04..c9ed307fa8c 100644 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt @@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ Card.Self | AddTrigger$ TrigDrain | IsPresent$ Cl SVar:TrigDrain:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life. SVar:TrigLoseLife:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 -DeckHas:Ability$Sacrifice +DeckHas:Ability$Sacrifice & Ability$LifeGain DeckNeeds:Type$Cleric Oracle:{2}, {T}, Sacrifice a creature: Draw a card.\nAs long as you control a Cleric, Relic Vial has "Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life." diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/throne_of_makindi.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/throne_of_makindi.txt index ca694f4bdd6..a583aeb926b 100644 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/throne_of_makindi.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/throne_of_makindi.txt @@ -4,4 +4,5 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ PutCounter | Cost$ 1 T | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ Any | Amount$ 2 | RestrictValid$ Spell.Kicked | SpellDescription$ Add two mana of any one color. Spend this mana only to cast kicked spells. +DeckHas:Ability$Counters Oracle:{T}: Add {C}.\n{1}, {T}: Put a charge counter on Throne of Makindi.\n{T}, Remove a charge counter from Throne of Makindi: Add two mana of any one color. Spend this mana only to cast kicked spells. From 71e521e7888a9241d1adc7e96be895fcb45ac4f6 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 18 Sep 2020 12:11:15 -0400 Subject: [PATCH 33/96] CountersPutEffect Stringbuilder tweak for 0 targets --- .../java/forge/game/ability/effects/CountersPutEffect.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java index 61d58891566..d00896a5d05 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -49,6 +49,13 @@ public class CountersPutEffect extends SpellAbilityEffect { final boolean dividedAsYouChoose = spellAbility.hasParam("DividedAsYouChoose"); final int amount = AbilityUtils.calculateAmount(card, spellAbility.getParamOrDefault("CounterNum", "1"), spellAbility); + //skip the StringBuilder if no targets are chosen ("up to" scenario) + if (spellAbility.usesTargeting()) { + final List targetCards = SpellAbilityEffect.getTargetCards(spellAbility); + if (targetCards.size() == 0) { + return stringBuilder.toString(); + } + } if (spellAbility.hasParam("Bolster")) { stringBuilder.append("Bolster ").append(amount); return stringBuilder.toString(); From 8a0a18de35d44e21fd5a76b9a6a113e90d232b18 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 18 Sep 2020 09:38:12 -0400 Subject: [PATCH 34/96] - stringbuilder tweaks for StackDesc --- .../ability/effects/ChangeZoneEffect.java | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 79fab604916..a0658245c3f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -121,7 +121,14 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } final String destination = sa.getParam("Destination"); - final String type = sa.hasParam("ChangeType") ? sa.getParam("ChangeType") : "Card"; + String type = "card"; + if (sa.hasParam("ChangeTypeDesc")) { + type = sa.getParam("ChangeTypeDesc"); + } + else if (sa.hasParam("ChangeType")) { + type = sa.getParam("ChangeType"); + } + final int num = sa.hasParam("ChangeNum") ? AbilityUtils.calculateAmount(host, sa.getParam("ChangeNum"), sa) : 1; @@ -140,8 +147,17 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } else if (origin.equals("Library")) { sb.append(chooserNames); sb.append(" search").append(choosers.size() > 1 ? " " : "es "); - sb.append(fetchPlayer); - sb.append("'s library for ").append(num).append(" ").append(type).append(" and "); + sb.append(fetchPlayer).append(fetchPlayer.equals(chooserNames) ? "'s " : " "); + sb.append("library for ").append(num).append(" "); + sb.append(type).append(num > 1 ? "s" : ""); + if (!sa.hasParam("NoReveal")) { + if (choosers.size() == 1) { + sb.append(num > 1 ? ", reveals those cards," : ", reveals that card,"); + } else { + sb.append(num > 1 ? ", reveal those cards," : ", reveal that card,"); + } + } + sb.append(" and "); if (destination.equals("Exile")) { if (num == 1) { @@ -169,10 +185,19 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } if (destination.equals("Hand")) { - sb.append("into its owner's hand."); + if (num == 1) { + sb.append("into its owner's hand."); + } else { + sb.append("into their owner's hand."); + } } if (destination.equals("Graveyard")) { - sb.append("into its owners's graveyard."); + if (num == 1) { + sb.append("into its owner's graveyard."); + } else { + sb.append("into their owner's graveyard."); + } + } } sb.append(" Then shuffle that library."); From ef0888e70d7b460a738b621e01158abb8374ca9c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 19 Sep 2020 16:05:47 -0400 Subject: [PATCH 35/96] molten_blast.txt fix first mode --- forge-gui/res/cardsfolder/upcoming/ZNR/molten_blast.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/molten_blast.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/molten_blast.txt index 0407e95f5ed..bd2fa916a79 100755 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/molten_blast.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/molten_blast.txt @@ -2,6 +2,6 @@ Name:Molten Blast ManaCost:2 R Types:Instant A:SP$ Charm | Cost$ 2 R | CharmNum$ 1 | Choices$ Shock,DestroyArtifact -SVar:Shock:DB$ DealDamage | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or planeswalker. +SVar:Shock:DB$ DealDamage | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or planeswalker. SVar:DestroyArtifact:DB$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. Oracle:Choose one —\n• Molten Blast deals 2 damage to target creature or planeswalker.\n• Destroy target artifact. From 92401f52eb827415b2ca59dbda0f16112b8e5ef7 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 19 Sep 2020 19:07:56 -0400 Subject: [PATCH 36/96] zagras_thief_of_heartbeats.txt (Marvel) --- .../upcoming/ZNR/zagras_thief_of_heartbeats.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/zagras_thief_of_heartbeats.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/zagras_thief_of_heartbeats.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/zagras_thief_of_heartbeats.txt new file mode 100644 index 00000000000..89c972e646d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/zagras_thief_of_heartbeats.txt @@ -0,0 +1,15 @@ +Name:Zagras, Thief of Heartbeats +ManaCost:4 B R +Types:Legendary Creature Vampire Rogue +PT:4/4 +K:Flying +K:Deathtouch +K:Haste +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | References$ X | Description$ This spell costs {1} less to cast for each creature in your party. +SVar:X:Count$Party +S:Mode$ Continuous | Affected$ Creature.Other+YouCtrl | AddKeyword$ Deathtouch | Description$ Other creatures you control have deathtouch. +T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | ValidTarget$ Planeswalker | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever a creature you control deals combat damage to a planeswalker, destroy that planeswalker. +SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredTarget +DeckHas:Ability$Party +DeckHints:Type$Cleric|Warrior|Wizard +Oracle:This spell costs 1 less to cast for each creature in your party.\nFlying, deathtouch, haste \nOther creatures you control have deathtouch.\nWhenever a creature you control deals combat damage to a planeswalker, destroy that planeswalker. From 1f8d0eb3ffbd32b97524396c6bd7d44f7bdd2588 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 19 Sep 2020 19:18:08 -0400 Subject: [PATCH 37/96] grakmaw_skyclave_ravager.txt and token --- .../upcoming/ZNR/grakmaw_skyclave_ravager.txt | 13 +++++++++++++ forge-gui/res/tokenscripts/bg_x_x_hydra.txt | 6 ++++++ 2 files changed, 19 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/grakmaw_skyclave_ravager.txt create mode 100644 forge-gui/res/tokenscripts/bg_x_x_hydra.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/grakmaw_skyclave_ravager.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/grakmaw_skyclave_ravager.txt new file mode 100755 index 00000000000..21b692cfe15 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/grakmaw_skyclave_ravager.txt @@ -0,0 +1,13 @@ +Name:Grakmaw, Skyclave Ravager +ManaCost:1 B G +Types:Legendary Creature Hydra Horror +PT:0/0 +K:etbCounter:P1P1:3 +SVar:WasKicked:Count$CardCounters.P1P1 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl+Other+counters_GE1_P1P1 | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerController$ TriggeredCardController | TriggerDescription$ Whenever another creature you control dies, if it had a +1/+1 counter on it, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ConditionPresent$ Card.StrictlySelf +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, create an X/X black and green Hydra creature token, where X is the number of +1/+1 counters on CARDNAME. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ bg_x_x_hydra | TokenOwner$ TriggeredCardController | TokenPower$ X | TokenToughness$ X | References$ X +SVar:X:TriggeredCard$CardCounters.P1P1 +DeckHas:Ability$Counters & Ability$Token +Oracle:Grakmaw, Skyclave Ravager enters the battlefield with three +1/+1 counters on it.\nWhenever another creature you control dies, if it had a +1/+1 counter on it, put a +1/+1 counter on Grakmaw.\nWhen Grakmaw dies, create an X/X black and green Hydra creature token, where X is the number of +1/+1 counters on Grakmaw. diff --git a/forge-gui/res/tokenscripts/bg_x_x_hydra.txt b/forge-gui/res/tokenscripts/bg_x_x_hydra.txt new file mode 100644 index 00000000000..512f9b800ea --- /dev/null +++ b/forge-gui/res/tokenscripts/bg_x_x_hydra.txt @@ -0,0 +1,6 @@ +Name:Hydra +ManaCost:no cost +Colors:black,green +Types:Creature Hydra +PT:*/* +Oracle: From 1f06318f04cafcc90ec914dcb0b6007a37f8306d Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 19 Sep 2020 19:20:35 -0400 Subject: [PATCH 38/96] shatterskull_charger.txt Trigger wrong wording (prob Scryfall - Forgescribe) --- .../res/cardsfolder/upcoming/ZNR/shatterskull_charger.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_charger.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_charger.txt index af28bda3a88..c43c01ace52 100755 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_charger.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_charger.txt @@ -7,8 +7,8 @@ K:Trample K:Haste K:etbCounter:P1P1:1:CheckSVar$ WasKicked:If CARDNAME was kicked, it enters the battlefield with a +1/+1 counter on it. SVar:WasKicked:Count$Kicked.1.0 -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | Execute$ TrigReturn | IsPresent$ Card.Self+counters_EQ0_P1P1 | TriggerDescription$ At the beginning of the end step, return Shatterskull Charger to its owner's hand unless it has a +1/+1 counter on it. +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigReturn | IsPresent$ Card.Self+counters_EQ0_P1P1 | TriggerDescription$ At the beginning of your end step, return Shatterskull Charger to its owner's hand unless it has a +1/+1 counter on it. SVar:TrigReturn:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ Self SVar:PlayMain1:TRUE DeckHas:Ability$Counters -Oracle:Kicker {2}\nTrample, haste\nIf Shatterskull Charger was kicked, it enters the battlefield with a +1/+1 counter on it.\nAt the beginning of the end step, return Shatterskull Charger to its owner's hand unless it has a +1/+1 counter on it. +Oracle:Kicker {2}\nTrample, haste\nIf Shatterskull Charger was kicked, it enters the battlefield with a +1/+1 counter on it.\nAt the beginning of your end step, return Shatterskull Charger to its owner's hand unless it has a +1/+1 counter on it. From bfc00181ebb3eb28685a9d83f192aa8701dcbe29 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 19 Sep 2020 19:25:04 -0400 Subject: [PATCH 39/96] linvala_shield_of_sea_gate.txt --- .../upcoming/ZNR/linvala_shield_of_sea_gate.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/linvala_shield_of_sea_gate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/linvala_shield_of_sea_gate.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/linvala_shield_of_sea_gate.txt new file mode 100755 index 00000000000..2844c99de3e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/linvala_shield_of_sea_gate.txt @@ -0,0 +1,15 @@ +Name:Linvala, Shield of Sea Gate +ManaCost:1 W U +Types:Legendary Creature Angel Wizard +PT:3/3 +K:Flying +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ EQ4 | Execute$ TrigPump | TriggerDescription$ At the beginning of combat on your turn, if you have a full party, choose target nonland permanent an opponent controls. Until your next turn, it can't attack or block, and its activated abilities can't be activated. +SVar:TrigPump:DB$ Pump | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Choose target nonland permanent an opponent controls | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | AILogic$ DetainNonLand +A:AB$ GenericChoice | Cost$ Sac<1/CARDNAME> | Choices$ PumpHexproof,PumpIndestructible | StackDescription$ {p:You} chooses hexproof or indestructible. Creatures {p:You} controls gain that ability until end of turn. | SpellDescription$ Choose hexproof or indestructible. Creatures you control gain that ability until end of turn. +SVar:PumpHexproof:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Hexproof | SpellDescription$ Hexproof +SVar:PumpIndestructible:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Indestructible | SpellDescription$ Indestructible +SVar:X:Count$Party +DeckHas:Ability$Party & Ability$Sacrifice +SVar:BuffedBy:Rogue,Warrior,Wizard +DeckHints:Type$Rogue|Warrior|Wizard +Oracle:Flying\nAt the beginning of combat on your turn, if you have a full party, choose target nonland permanent an opponent controls. Until your next turn, it can't attack or block, and its activated abilities can't be activated.\nSacrifice Linvala: Choose hexproof or indestructible. Creatures you control gain that ability until end of turn. From 9a46e91a530411fb97d8db6fe0f6c9382b597811 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 19 Sep 2020 17:48:03 -0400 Subject: [PATCH 40/96] skyclave_sentinel.txt (Marvel) --- .../cardsfolder/upcoming/ZNR/skyclave_sentinel.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_sentinel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_sentinel.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_sentinel.txt new file mode 100644 index 00000000000..bfac1929b3f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_sentinel.txt @@ -0,0 +1,12 @@ +Name:Skyclave Sentinel +ManaCost:3 +Types:Artifact Creature Gargoyle +PT:2/3 +K:Kicker:4 +K:Flying +K:Defender +K:etbCounter:P1P1:2:CheckSVar$ WasKicked:If CARDNAME was kicked, it enters the battlefield with two +1/+1 counters on it. +S:Mode$ Continuous | Affected$ Card.Self+counters_GE1_P1P1 | AddHiddenKeyword$ CARDNAME can attack as though it didn't have defender. | Description$ As long as CARDNAME has a +1/+1 counter on it, it can attack as though it didn't have defender. +SVar:WasKicked:Count$Kicked.1.0 +DeckHas:Ability$Counters +Oracle:Kicker {4} (You may pay an additional {4} as you cast this spell).\nFlying, defender\nIf Skyclave Sentinel was kicked, it enters the battlefield with two +1/+1 counters on it.\nAs long as Skyclave Sentinel has a +1/+1 counter on it, it can attack as though it didn't have defender. From de36c6c6401a419463b8320ad15f4c5df9607b55 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 19 Sep 2020 17:48:21 -0400 Subject: [PATCH 41/96] moss_pit_skeleton.txt --- .../cardsfolder/upcoming/ZNR/moss_pit_skeleton.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/moss_pit_skeleton.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/moss_pit_skeleton.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/moss_pit_skeleton.txt new file mode 100755 index 00000000000..dcf35870975 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/moss_pit_skeleton.txt @@ -0,0 +1,11 @@ +Name:Moss-Pit Skeleton +ManaCost:B G +Types:Creature Plant Skeleton +PT:2/2 +K:Kicker:3 +K:etbCounter:P1P1:3:CheckSVar$ WasKicked:If CARDNAME was kicked, it enters the battlefield with three +1/+1 counters on it. +SVar:WasKicked:Count$Kicked.1.0 +T:Mode$ CounterAddedOnce | ValidCard$ Creature.YouCtrl | CounterType$ P1P1 | TriggerZones$ Graveyard | IsPresent$ Card.StrictlySelf | PresentZone$ Graveyard | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ Whenever one or more +1/+1 counters are put on a creature you control, if CARDNAME is in your graveyard, you may put CARDNAME on top of your library. +SVar:TrigChange:DB$ ChangeZone | Defined$ Self | Origin$ Graveyard | Destination$ Library +DeckHints:Ability$Counters & Ability$Graveyard +Oracle:Kicker {3} (You may pay an additional {3} as you cast this spell)\nIf Moss-Pit Skeleton was kicked, it enters the battlefield with three +1/+1 counters on it.\nWhenever one or more +1/+1 counters are put on a creature you control, if Moss-Pit Skeleton is in your graveyard, you may put Moss-Pit Skeleton on top of your library. From b267c2755e328643493c9fabb43d861721982a4e Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 19 Sep 2020 20:18:09 -0400 Subject: [PATCH 42/96] relic_axe.txt --- .../res/cardsfolder/upcoming/ZNR/relic_axe.txt | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/relic_axe.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/relic_axe.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/relic_axe.txt new file mode 100755 index 00000000000..dd7edc252be --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/relic_axe.txt @@ -0,0 +1,13 @@ +Name:Relic Axe +ManaCost:2 +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When CARDNAME enters the battlefield, attach it to target creature you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | AITgts$ Warrior | TgtPrompt$ Select target creature you control +S:Mode$ Continuous | Affected$ Card.EquippedBy | AddPower$ X | AddToughness$ 1 | References$ X,Y | Description$ Equipped creature gets +1/+1. If it's a Warrior, it gets +2/+1 instead. +SVar:X:Count$Compare Y GE1.2.1 +SVar:Y:Targeted$Valid Warrior +SVar:Y:Count$Valid Warrior.AttachedBy +K:Equip:2 +SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield +DeckHints:Type$Warrior +Oracle:When Relic Axe enters the battlefield, attach it to target creature you control.\nEquipped creature gets +1/+1. If it's a Warrior, it gets +2/+1 instead.\nEquip {2} From 81eb167b3d8697b3d9b2e7703c36e3b8e7d44bfd Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 19 Sep 2020 20:20:11 -0400 Subject: [PATCH 43/96] phylath_world_sculptor.txt --- .../upcoming/ZNR/phylath_world_sculptor.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/phylath_world_sculptor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/phylath_world_sculptor.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/phylath_world_sculptor.txt new file mode 100755 index 00000000000..682674b1e4e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/phylath_world_sculptor.txt @@ -0,0 +1,12 @@ +Name:Phylath, World Sculptor +ManaCost:4 R G +Types:Legendary Creature Elemental +PT:5/5 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 0/1 green Plant creature token for each basic land you control. +SVar:TrigToken:DB$ Token | TokenAmount$ X | References$ X | TokenScript$ g_0_1_plant | TokenOwner$ You +SVar:X:Count$Valid Land.Basic+YouCtrl +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, put four +1/+1 counters on target Plant you control. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Plant.YouCtrl | TgtPrompt$ Select target Plant you control | CounterType$ P1P1 | CounterNum$ 4 +SVar:BuffedBy:Land,Land.Basic +DeckHas:Ability$Token & Ability$Counters +Oracle:When Phylath, World Sculptor enters the battlefield, create a 0/1 green Plant creature token for each basic land you control.\nLandfall — Whenever a land enters the battlefield under your control, put four +1/+1 counters on target Plant you control. From f580238eefbef159fcd895df19d4a6f23f875056 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 19 Sep 2020 20:20:24 -0400 Subject: [PATCH 44/96] lullmages_familiar.txt --- .../cardsfolder/upcoming/ZNR/lullmages_familiar.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/lullmages_familiar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/lullmages_familiar.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/lullmages_familiar.txt new file mode 100755 index 00000000000..1ab84dace7a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/lullmages_familiar.txt @@ -0,0 +1,10 @@ +Name:Lullmage's Familiar +ManaCost:1 G U +Types:Creature Beast +PT:2/4 +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +T:Mode$ SpellCast | ValidCard$ Card.kicked | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a kicked spell, you gain 2 life. +SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 +SVar:BuffedBy:Card.withKicker,Card.withMultikicker +Oracle:{T}: Add {G} or {U}.\nWhenever you cast a kicked spell, you gain 2 life. From b9f315b9b089a7eb50d71bbe41df2a657406fa5b Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 19 Sep 2020 21:53:18 -0400 Subject: [PATCH 45/96] ravagers_mace.txt --- .../res/cardsfolder/upcoming/ZNR/ravagers_mace.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/ravagers_mace.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/ravagers_mace.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/ravagers_mace.txt new file mode 100755 index 00000000000..f82ef56f2a6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/ravagers_mace.txt @@ -0,0 +1,12 @@ +Name:Ravager's Mace +ManaCost:1 B R +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When CARDNAME enters the battlefield, attach it to target creature you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control +S:Mode$ Continuous | Affected$ Card.EquippedBy | AddPower$ X | AddKeyword$ Menace | Description$ Equipped creature gets +1/+0 for each creature in your party and has menace. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.) +SVar:X:Count$Party +K:Equip:2 B R +SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield +DeckHas:Ability$Party +DeckHints:Type$Cleric|Rogue|Warrior|Wizard +Oracle:When Ravager's Mace enters the battlefield, attach it to target creature you control.\nEquipped creature gets +1/+0 for each creature in your party and has menace. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.)\nEquip {2}{B}{R} From 60391b1be2119beba63628799960c8e8a0b2a360 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 19 Sep 2020 21:54:21 -0400 Subject: [PATCH 46/96] spoils_of_adventure.txt --- .../cardsfolder/upcoming/ZNR/spoils_of_adventure.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/spoils_of_adventure.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/spoils_of_adventure.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/spoils_of_adventure.txt new file mode 100755 index 00000000000..c9ba92d79e9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/spoils_of_adventure.txt @@ -0,0 +1,10 @@ +Name:Spoils of Adventure +ManaCost:4 W U +Types:Instant +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | References$ X | Description$ This spell costs {1} less to cast for each creature in your party. +SVar:X:Count$Party +A:SP$ GainLife | Cost$ 4 W U | LifeAmount$ 3 | SubAbility$ DBDraw | SpellDescription$ You gain 3 life and draw three cards. +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 3 +DeckHas:Ability$Party +DeckHints:Type$Cleric|Rogue|Warrior|Wizard +Oracle:This spell costs {1} less to cast for each creature in your party. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.)\nYou gain 3 life and draw three cards. From 112844bc0245f6126f4226ad49d59cb54231f4cd Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 20 Sep 2020 08:16:33 -0400 Subject: [PATCH 47/96] cliffhaven_kitesail.txt --- .../res/cardsfolder/upcoming/ZNR/cliffhaven_kitesail.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/cliffhaven_kitesail.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cliffhaven_kitesail.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/cliffhaven_kitesail.txt new file mode 100755 index 00000000000..179ea82edf9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/cliffhaven_kitesail.txt @@ -0,0 +1,9 @@ +Name:Cliffhaven Kitesail +ManaCost:1 +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When CARDNAME enters the battlefield, attach it to target creature you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control +SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Flying | Description$ Equipped creature has flying. +K:Equip:2 +Oracle:When Cliffhaven Kitesail enters the battlefield, attach it to target creature you control.\nEquipped creature has flying.\nEquip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) From ad8a12487624568c787d4b4c25aacd66683b77e3 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 20 Sep 2020 08:18:23 -0400 Subject: [PATCH 48/96] relic_golem.txt --- forge-gui/res/cardsfolder/upcoming/ZNR/relic_golem.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/relic_golem.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/relic_golem.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/relic_golem.txt new file mode 100755 index 00000000000..9c6a000c03f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/relic_golem.txt @@ -0,0 +1,9 @@ +Name:Relic Golem +ManaCost:3 +Types:Artifact Creature Golem +PT:6/6 +S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't attack or block. | CheckSVar$ X | SVarCompare$ LT8 | Description$ CARDNAME can't attack or block unless an opponent has eight or more cards in their graveyard. +SVar:X:PlayerCountOpponents$HighestCardsInGraveyard +A:AB$ Mill | Cost$ 2 T | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player mills two cards. (They put the top two cards of their library into their graveyard.) +DeckHas:Ability$Mill +Oracle:Relic Golem can't attack or block unless an opponent has eight or more cards in their graveyard.\n{2}, {T}: Target player mills two cards. (They put the top two cards of their library into their graveyard.) From d2174a78070a07baadcb9eba9bf92ae1378dfe72 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 20 Sep 2020 08:32:45 -0400 Subject: [PATCH 49/96] myriad_construct.txt and token --- .../upcoming/ZNR/myriad_construct.txt | 17 +++++++++++++++++ .../res/tokenscripts/c_1_1_a_construct.txt | 5 +++++ 2 files changed, 22 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/myriad_construct.txt create mode 100644 forge-gui/res/tokenscripts/c_1_1_a_construct.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/myriad_construct.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/myriad_construct.txt new file mode 100755 index 00000000000..126c695db3c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/myriad_construct.txt @@ -0,0 +1,17 @@ +Name:Myriad Construct +ManaCost:4 +Types:Artifact Creature Construct +PT:4/4 +K:Kicker:3 +R:Event$ Moved | ValidCard$ Card.Self+kicked | Destination$ Battlefield | ReplaceWith$ DBPutCounter | Description$ If CARDNAME was kicked, it enters the battlefield with a +1/+1 counter on it for each nonbasic land your opponents control. +SVar:DBPutCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ DBMoveToPlay +SVar:DBMoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +SVar:X:Count$LastStateBattlefield Land.nonBasic+OppCtrl +SVar:NeedsToPlayKicked:Land.nonBasic+OppCtrl +T:Mode$ BecomesTarget | ValidTarget$ Card.Self | TriggerZones$ Battlefield | SourceType$ Spell | Execute$ TrigSac | TriggerDescription$ When CARDNAME becomes the target of a spell, sacrifice it and create a number of 1/1 colorless Construct artifact creature tokens equal to its power. +SVar:TrigSac:DB$ Destroy | Defined$ Self | Sacrifice$ True | RememberLKI$ True | SubAbility$ DBToken +SVar:DBToken:DB$ Token | TokenAmount$ Y | References$ Y | TokenScript$ c_1_1_a_construct | TokenOwner$ You | SubAbility$ DBCleanup +SVar:Y:RememberedLKI$CardPower +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Token & Ability$Counters +Oracle:Kicker {3}\nIf Myriad Construct was kicked, it enters the battlefield with a +1/+1 counter on it for each nonbasic land your opponents control.\nWhen Myriad Construct becomes the target of a spell, sacrifice it and create a number of 1/1 colorless Construct artifact creature tokens equal to its power. diff --git a/forge-gui/res/tokenscripts/c_1_1_a_construct.txt b/forge-gui/res/tokenscripts/c_1_1_a_construct.txt new file mode 100644 index 00000000000..eeea124b2e0 --- /dev/null +++ b/forge-gui/res/tokenscripts/c_1_1_a_construct.txt @@ -0,0 +1,5 @@ +Name:Construct +ManaCost:no cost +PT:1/1 +Types:Artifact Creature Construct +Oracle: From b21a249715a70add81b6684131ddbc5482756830 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 20 Sep 2020 16:18:10 -0400 Subject: [PATCH 50/96] lullmages_familiar.txt DeckHas --- forge-gui/res/cardsfolder/upcoming/ZNR/lullmages_familiar.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/lullmages_familiar.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/lullmages_familiar.txt index 1ab84dace7a..4888b08a66c 100755 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/lullmages_familiar.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/lullmages_familiar.txt @@ -7,4 +7,5 @@ A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. T:Mode$ SpellCast | ValidCard$ Card.kicked | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a kicked spell, you gain 2 life. SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 SVar:BuffedBy:Card.withKicker,Card.withMultikicker +DeckHas:Ability$LifeGain Oracle:{T}: Add {G} or {U}.\nWhenever you cast a kicked spell, you gain 2 life. From 2f2a903dc6638cb7d3a1365d994024ff2faab222 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 19 Sep 2020 17:28:20 -0400 Subject: [PATCH 51/96] script (squee1968) --- .../cardsfolder/upcoming/ZNR/forsaken_monument.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/forsaken_monument.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/forsaken_monument.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/forsaken_monument.txt new file mode 100644 index 00000000000..c1e2c929667 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/forsaken_monument.txt @@ -0,0 +1,12 @@ +Name:Forsaken Monument +ManaCost:5 +Types:Legendary Artifact +S:Mode$ Continuous | Affected$ Creature.Colorless+YouCtrl | AddPower$ 2 | AddToughness$ 2 | Description$ Colorless creatures you control get +2/+2. +T:Mode$ TapsForMana | ValidCard$ Permanent.YouCtrl | Produced$ C | Execute$ TrigMana | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever you tap a permanent for {C}, add an additional {C}. +SVar:TrigMana:DB$ Mana | Produced$ C +T:Mode$ SpellCast | ValidCard$ Card.Colorless | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a colorless spell, you gain 1 life. +SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +SVar:PlayMain1:TRUE +DeckHints:Color$Colorless +DeckHas:Ability$LifeGain +Oracle:Colorless creatures you control get +2/+2.\nWhenever you tap a permanent for {C}, add an additional {C}.\nWhenever you cast a colorless spell, you gain 1 life. From 007a8e8fbae43edcca89b13c193793baf21d1819 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 19 Sep 2020 17:29:21 -0400 Subject: [PATCH 52/96] TriggerTapsForMana.java support - seems to work! --- .../src/main/java/forge/game/trigger/TriggerTapsForMana.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java index 6cbf96cc1aa..644bf826017 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java @@ -100,6 +100,9 @@ public class TriggerTapsForMana extends Trigger { return false; } } + if (!produced.contains(MagicColor.toShortString(this.getParam("Produced")))) { + return false; + } } return true; From af0643d0d2946bb5f37c49ec55b8dc965c47e223 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 20 Sep 2020 16:25:31 -0400 Subject: [PATCH 53/96] indent consistency --- .../main/java/forge/game/trigger/TriggerTapsForMana.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java index 644bf826017..9835186cc6a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java @@ -99,9 +99,9 @@ public class TriggerTapsForMana extends Trigger { if (!this.getHostCard().hasChosenColor() || !produced.contains(MagicColor.toShortString(this.getHostCard().getChosenColor()))) { return false; } - } - if (!produced.contains(MagicColor.toShortString(this.getParam("Produced")))) { - return false; + if (!produced.contains(MagicColor.toShortString(this.getParam("Produced")))) { + return false; + } } } From 5f2842a1801502f24cca718a6a21d24655c366e9 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 20 Sep 2020 19:53:40 -0400 Subject: [PATCH 54/96] CardFactoryUtil.java add "CardNumAttacksThisTurn" --- forge-game/src/main/java/forge/game/card/CardFactoryUtil.java | 3 +++ 1 file changed, 3 insertions(+) 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 fce27c3824a..e02a9b1106c 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1294,6 +1294,9 @@ public class CardFactoryUtil { if (sq[0].contains("CardNumColors")) { return doXMath(CardUtil.getColors(c).countColors(), m, c); } + if (sq[0].contains("CardNumAttacksThisTurn")) { + return doXMath(c.getDamageHistory().getCreatureAttacksThisTurn(), m, c); + } if (sq[0].contains("ChosenNumber")) { Integer i = c.getChosenNumber(); return doXMath(i == null ? 0 : i, m, c); From 1439069492ea02fb272daaafe274df1fe246fcc5 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 20 Sep 2020 19:53:57 -0400 Subject: [PATCH 55/96] moraug_fury_of_akoum.txt --- .../upcoming/ZNR/moraug_fury_of_akoum.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/moraug_fury_of_akoum.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/moraug_fury_of_akoum.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/moraug_fury_of_akoum.txt new file mode 100644 index 00000000000..b884bbf4a18 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/moraug_fury_of_akoum.txt @@ -0,0 +1,12 @@ +Name:Moraug, Fury of Akoum +ManaCost:4 R R +Types:Legendary Creature Minotaur Warrior +PT:6/6 +S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ AffectedX | Description$ Each creature you control gets +1/+0 for each time it has attacked this turn. +SVar:AffectedX:Count$CardNumAttacksThisTurn +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Condition$ PlayerTurn | Phase$ Main1,Main2 | Execute$ TrigAddPhase | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, if it's your main phase, there's an additional combat phase after this phase. At the beginning of that combat, untap all creatures you control. +SVar:TrigAddPhase:DB$ AddPhase | ExtraPhase$ BeginCombat | AfterPhase$ Main1 | FollowedBy$ BeginCombat | ConditionPhases$ Main1 | SubAbility$ DBAddPhase +SVar:DBAddPhase:DB$ AddPhase | ExtraPhase$ BeginCombat | AfterPhase$ Main2 | FollowedBy$ End of Turn | ConditionPhases$ Main2 | SubAbility$ DelTrigUntap +SVar:DelTrigUntap:DB$ DelayedTrigger | Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigUntapAll | TriggerDescription$ At the beginning of that combat, untap all creatures you control. +SVar:TrigUntapAll:DB$ UntapAll | ValidCards$ Creature.YouCtrl +Oracle:Each creature you control gets +1/+0 for each time it has attacked this turn.\nLandfall — Whenever a land enters the battlefield under your control, if it's your main phase, there's an additional combat phase after this phase. At the beginning of that combat, untap all creatures you control. From 9c21c12c94ab16015f41be5edce327426a0ed4f7 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 20 Sep 2020 21:32:51 -0400 Subject: [PATCH 56/96] CardFactoryUtil.java add Count$OppTypesInGrave --- .../src/main/java/forge/game/card/CardFactoryUtil.java | 8 ++++++++ 1 file changed, 8 insertions(+) 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 fce27c3824a..6f781e89bea 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -43,6 +43,7 @@ import forge.game.keyword.Keyword; import forge.game.keyword.KeywordInterface; import forge.game.phase.PhaseHandler; import forge.game.player.Player; +import forge.game.player.PlayerCollection; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementHandler; import forge.game.replacement.ReplacementLayer; @@ -1336,6 +1337,13 @@ public class CardFactoryUtil { return doXMath(getCardTypesFromList(game.getCardsIn(ZoneType.smartValueOf(sq[1]))), m, c); } + if (sq[0].contains("OppTypesInGrave")) { + final PlayerCollection opponents = cc.getOpponents(); + CardCollection oppCards = new CardCollection(); + oppCards.addAll(opponents.getCardsIn(ZoneType.Graveyard)); + return doXMath(getCardTypesFromList(oppCards), m, c); + } + if (sq[0].contains("BushidoPoint")) { return doXMath(c.getKeywordMagnitude(Keyword.BUSHIDO), m, c); } From 2bdac5a0fd25343325f1b9d0afc1b8ee830dc2a9 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 20 Sep 2020 21:33:19 -0400 Subject: [PATCH 57/96] nighthawk_scavenger.txt --- .../cardsfolder/upcoming/ZNR/nighthawk_scavenger.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/nighthawk_scavenger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nighthawk_scavenger.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/nighthawk_scavenger.txt new file mode 100644 index 00000000000..1009360fade --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/nighthawk_scavenger.txt @@ -0,0 +1,10 @@ +Name:Nighthawk Scavenger +ManaCost:1 B B +Types:Creature Vampire Rogue +PT:1+*/3 +K:Flying +K:Deathtouch +K:Lifelink +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | References$ X | Description$ CARDNAME's power is equal to 1 plus the number of card types among cards in your opponents' graveyards. +SVar:X:Count$OppTypesInGrave/Plus.1 +Oracle:Flying, deathtouch, lifelink\nNighthawk Scavenger's power is equal to 1 plus the number of card types among cards in your opponents' graveyards. From b6f9b4feb7c70b5a35f70e0c4a8c5048fc401214 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Mon, 21 Sep 2020 07:36:18 +0200 Subject: [PATCH 58/96] ZNR: MDFC + MayPlay --- forge-game/src/main/java/forge/game/card/Card.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 1ec7fbe8a83..d26f2fc876f 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -6174,6 +6174,12 @@ public class Card extends GameEntity implements Comparable { source.forceTurnFaceUp(); } + // the modal state is not copied with lki, need to copy it extra + if (!source.hasState(CardStateName.Modal)) { + source.addAlternateState(CardStateName.Modal, false); + source.getState(CardStateName.Modal).copyFrom(this.getState(CardStateName.Modal), true); + } + source.setSplitStateToPlayAbility(la); if (la.canPlay(source)) { From c2d04d26dd02001fbb1355e64a284ca7a19221ae Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Mon, 21 Sep 2020 18:00:02 +0800 Subject: [PATCH 59/96] translate new setting --- forge-gui/res/languages/de-DE.properties | 2 ++ forge-gui/res/languages/en-US.properties | 4 ++-- forge-gui/res/languages/es-ES.properties | 2 ++ forge-gui/res/languages/it-IT.properties | 2 ++ forge-gui/res/languages/zh-CN.properties | 2 ++ 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index f7ef60e3d03..3ec99812cd6 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -183,6 +183,8 @@ nlEnableMusic=Hintergrundmusik während des Spiels nlAltSoundSystem=Nutze alternatives Sound-System (nur nutzen, wenn es Probleme mit fehlenden Geräuschen gibt) nlSrOptimize=Setze verschiedene Optionen, um Forge besser für Screenreader lesbar zu machen KeyboardShortcuts=Tastenkombinationen +cbpLandPlayed=Land entering battlefield notifications +nlpLandPlayed=Choose when you want to get visual notifications for a land entering the battlefield: Never, always, or only for the lands entering a battlefield because of an action of a AI player #VSubmenuAchievements.java lblAchievements=Errungenschaften #VSubmenuDownloaders.java diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index ea286757045..38a5a765a60 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -183,6 +183,8 @@ nlEnableMusic=Enable background music during the game nlAltSoundSystem=Use the alternate sound system (only use if you have issues with sound not playing or disappearing) nlSrOptimize=Set various options to make FOrge work better with screen readers KeyboardShortcuts=Keyboard Shortcuts +cbpLandPlayed=Land entering battlefield notifications +nlpLandPlayed=Choose when you want to get visual notifications for a land entering the battlefield: Never, always, or only for the lands entering a battlefield because of an action of a AI player #VSubmenuAchievements.java lblAchievements=Achievements #VSubmenuDownloaders.java @@ -2584,5 +2586,3 @@ lblEnterMessageToSend=Enter message to send lblDetectedInvalidHostAddress=Invalid host address ({0}) was detected. #Player.java lblChooseACompanion=Choose a companion -cbpLandPlayed=Land entering battlefield notifications -nlpLandPlayed=Choose when you want to get visual notifications for a land entering the battlefield: Never, always, or only for the lands entering a battlefield because of an action of a AI player diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index 804e036e11d..9b0aff14f67 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -183,6 +183,8 @@ nlEnableMusic=Habilitar música de fondo durante el juego nlAltSoundSystem=Use el sistema de sonido alternativo (solo use si tiene problemas con el sonido que no se reproduce o desaparece) nlSrOptimize=Set various options to make FOrge work better with screen readers KeyboardShortcuts=Atajos de teclado +cbpLandPlayed=Land entering battlefield notifications +nlpLandPlayed=Choose when you want to get visual notifications for a land entering the battlefield: Never, always, or only for the lands entering a battlefield because of an action of a AI player #VSubmenuAchievements.java lblAchievements=Logros #VSubmenuDownloaders.java diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index a184ec1e714..362a93623d7 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -183,6 +183,8 @@ nlEnableMusic=Abilita la musica di sottofondo durante il gioco nlAltSoundSystem=Utilizza il sistema audio alternativo (utilizza solo se hai problemi con l''audio che non viene riprodotto o che scompare) nlSrOptimize=Set various options to make FOrge work better with screen readers KeyboardShortcuts=Tasti rapidi +cbpLandPlayed=Land entering battlefield notifications +nlpLandPlayed=Choose when you want to get visual notifications for a land entering the battlefield: Never, always, or only for the lands entering a battlefield because of an action of a AI player #VSubmenuAchievements.java lblAchievements=realizzazioni #VSubmenuDownloaders.java diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 1e4e6252a5f..bcb76ed43d8 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -183,6 +183,8 @@ nlEnableMusic=在游戏中启用背景音乐 nlAltSoundSystem=使用备用音效系统(仅在声音消失的情况使用) nlSrOptimize=使屏幕阅读器能更好的在forge上使用 KeyboardShortcuts=键盘快捷键 +cbpLandPlayed=当地牌进入战场发出通知 +nlpLandPlayed=选择你是否想收到地牌进入战场的视觉通知:从不(Never),总是(always), 或者只有当地牌是因AI玩家的动作而进入战场 #VSubmenuAchievements.java lblAchievements=成就 #VSubmenuDownloaders.java From be336ed1eccc627c2f978bc10391d35426aa7772 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Sep 2020 18:47:50 +0800 Subject: [PATCH 60/96] Stack Visual Improvement - Show Mana Symbols instead of text string for mana (B -> {B}, R -> {R}) --- forge-core/src/main/java/forge/util/TextUtil.java | 4 ++++ .../src/main/java/forge/game/ability/effects/ManaEffect.java | 4 +++- .../src/main/java/forge/game/trigger/TriggerTapsForMana.java | 4 +++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/forge-core/src/main/java/forge/util/TextUtil.java b/forge-core/src/main/java/forge/util/TextUtil.java index 06a706b20f0..8b39074224c 100644 --- a/forge-core/src/main/java/forge/util/TextUtil.java +++ b/forge-core/src/main/java/forge/util/TextUtil.java @@ -300,4 +300,8 @@ public class TextUtil { sb.append( str, idx1, str.length() ); return sb.toString(); } + //Convert to Mana String + public static String toManaString(String ManaProduced){ + return "{"+TextUtil.fastReplace(ManaProduced," ","}{")+"}"; + } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index 8558f46272b..56ad0850a19 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -24,6 +24,8 @@ import org.apache.commons.lang3.StringUtils; import com.google.common.collect.Iterables; import java.util.List; +import static forge.util.TextUtil.toManaString; + public class ManaEffect extends SpellAbilityEffect { @Override @@ -252,7 +254,7 @@ public class ManaEffect extends SpellAbilityEffect { final StringBuilder sb = new StringBuilder(); String mana = !sa.hasParam("Amount") || StringUtils.isNumeric(sa.getParam("Amount")) ? GameActionUtil.generatedMana(sa) : "mana"; - sb.append("Add ").append(mana).append("."); + sb.append("Add ").append(toManaString(mana)).append("."); return sb.toString(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java index 9835186cc6a..499e5426022 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java @@ -26,6 +26,8 @@ import forge.util.Localizer; import java.util.Map; +import static forge.util.TextUtil.toManaString; + /** *

* Trigger_TapsForMana class. @@ -119,7 +121,7 @@ public class TriggerTapsForMana extends Trigger { public String getImportantStackObjects(SpellAbility sa) { StringBuilder sb = new StringBuilder(); sb.append(Localizer.getInstance().getMessage("lblTappedForMana")).append(": ").append(sa.getTriggeringObject(AbilityKey.Card)); - sb.append(Localizer.getInstance().getMessage("lblProduced")).append(": ").append(sa.getTriggeringObject(AbilityKey.Produced)); + sb.append(Localizer.getInstance().getMessage("lblProduced")).append(": ").append(toManaString(sa.getTriggeringObject(AbilityKey.Produced).toString())); return sb.toString(); } From 0efb3ad04868861750be00fc4143efc3b98a89ff Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Sep 2020 18:59:07 +0800 Subject: [PATCH 61/96] update --- .../src/main/java/forge/game/ability/effects/ManaEffect.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index 56ad0850a19..8ecbbe1d982 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -254,7 +254,7 @@ public class ManaEffect extends SpellAbilityEffect { final StringBuilder sb = new StringBuilder(); String mana = !sa.hasParam("Amount") || StringUtils.isNumeric(sa.getParam("Amount")) ? GameActionUtil.generatedMana(sa) : "mana"; - sb.append("Add ").append(toManaString(mana)).append("."); + sb.append("Add ").append(mana == "mana" ? mana : toManaString(mana)).append("."); return sb.toString(); } } From fd466bcf05e87e0f00cc7841ab78ccadeb217e94 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Sep 2020 19:30:24 +0800 Subject: [PATCH 62/96] update fix for manamorphose --- forge-core/src/main/java/forge/util/TextUtil.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-core/src/main/java/forge/util/TextUtil.java b/forge-core/src/main/java/forge/util/TextUtil.java index 8b39074224c..4f5cc47eb44 100644 --- a/forge-core/src/main/java/forge/util/TextUtil.java +++ b/forge-core/src/main/java/forge/util/TextUtil.java @@ -302,6 +302,7 @@ public class TextUtil { } //Convert to Mana String public static String toManaString(String ManaProduced){ - return "{"+TextUtil.fastReplace(ManaProduced," ","}{")+"}"; + String convertedMana = "{"+TextUtil.fastReplace(ManaProduced," ","}{")+"}"; + return TextUtil.fastReplace(convertedMana,"{Combo}{Any}", "X mana in any combination"); //Fix manamorphose stack descrition, todo: better/alternative method.. } } From c53a5ef74315c12de19b583de0e59c27888d9cb3 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 21 Sep 2020 08:20:05 -0400 Subject: [PATCH 63/96] TrigDesc comma --- forge-gui/res/cardsfolder/v/vampire_sovereign.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/v/vampire_sovereign.txt b/forge-gui/res/cardsfolder/v/vampire_sovereign.txt index be7235f77ad..23743974283 100644 --- a/forge-gui/res/cardsfolder/v/vampire_sovereign.txt +++ b/forge-gui/res/cardsfolder/v/vampire_sovereign.txt @@ -3,7 +3,7 @@ ManaCost:3 B B Types:Creature Vampire Noble PT:3/4 K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigBite | TriggerDescription$ When CARDNAME enters the battlefield target opponent loses 3 life and you gain 3 life. -SVar:TrigBite:DB$LoseLife | ValidTgts$ Opponent | TgtPrompt$ Select an opponent | LifeAmount$ 3 | SubAbility$ DBGainLife | SpellDescription$ Target opponent loses 3 life and you gain 3 life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ 3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigBite | TriggerDescription$ When CARDNAME enters the battlefield, target opponent loses 3 life and you gain 3 life. +SVar:TrigBite:DB$ LoseLife | ValidTgts$ Opponent | TgtPrompt$ Select an opponent | LifeAmount$ 3 | SubAbility$ DBGainLife | SpellDescription$ Target opponent loses 3 life and you gain 3 life. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 3 Oracle:Flying\nWhen Vampire Sovereign enters the battlefield, target opponent loses 3 life and you gain 3 life. From 4ecae787f271008e024a1be0b03139e20e698499 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 21 Sep 2020 08:54:40 -0400 Subject: [PATCH 64/96] Fix attack prompt --- forge-gui/res/languages/en-US.properties | 2 +- forge-gui/src/main/java/forge/match/input/InputAttack.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index ea286757045..8fb1f5930c0 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1141,7 +1141,7 @@ lblStormCount=Storm Count #InputAttack.java lblCallBack=Call Back lblDisabled=Disabled -lblSelectAttackCreatures=Select creatures to attack +lblSelectAttackCreatures=Select creatures to attack lblSelectAttackTarget= or select player/planeswalker you wish to attack. lblSelectBandingTarget= To attack as a band, select an attacking creature to activate its ''band'' then select another to join it. #InputBlock.java diff --git a/forge-gui/src/main/java/forge/match/input/InputAttack.java b/forge-gui/src/main/java/forge/match/input/InputAttack.java index 956b94f5c31..5552774c24a 100644 --- a/forge-gui/src/main/java/forge/match/input/InputAttack.java +++ b/forge-gui/src/main/java/forge/match/input/InputAttack.java @@ -328,7 +328,7 @@ public class InputAttack extends InputSyncronizedBase { private void updateMessage() { Localizer localizer = Localizer.getInstance(); - String message = localizer.getMessage("lblSelectAttackCreatures") + currentDefender + localizer.getMessage("lblSelectAttackTarget"); + String message = localizer.getMessage("lblSelectAttackCreatures") + " " + currentDefender + " " + localizer.getMessage("lblSelectAttackTarget"); if (potentialBanding) { message += localizer.getMessage("lblSelectBandingTarget"); } From 181e8b897f87d587cc31e4ae45887083b305363e Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Mon, 21 Sep 2020 13:00:13 +0000 Subject: [PATCH 65/96] SpellAbility: make Basic Land Abilities Secondary and remove BasicLandProperty --- .../src/main/java/forge/game/card/CardFactoryUtil.java | 3 +-- .../main/java/forge/game/spellability/SpellAbility.java | 9 --------- 2 files changed, 1 insertion(+), 11 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 b8999d796ca..d1f5edd6eef 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -81,10 +81,9 @@ public class CardFactoryUtil { public static SpellAbility buildBasicLandAbility(final CardState state, byte color) { String strcolor = MagicColor.toShortString(color); String abString = "AB$ Mana | Cost$ T | Produced$ " + strcolor + - " | SpellDescription$ Add {" + strcolor + "}."; + " | Secondary$ True | SpellDescription$ Add {" + strcolor + "}."; SpellAbility sa = AbilityFactory.getAbility(abString, state); sa.setIntrinsic(true); // always intristic - sa.setBasicLandAbility(true); // to exclude it from other suspress effects return sa; } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 95db0fad1e5..11035b6a2b1 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -113,8 +113,6 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private boolean blessing = false; private Integer chapter = null; - private boolean basicLandAbility = false; - private CardStateName stateName = null; private int totalManaSpent = 0; @@ -789,13 +787,6 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit return this.isAlternativeCost(AlternativeCost.Flashback); } - public void setBasicLandAbility(final boolean basicLandAbility0) { - basicLandAbility = basicLandAbility0; - } - public boolean isBasicLandAbility() { - return basicLandAbility && isIntrinsic(); - } - /** * @return the aftermath */ From 933dab319ec765572399c83a325d4edd2653a3e8 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 21 Sep 2020 09:06:02 -0400 Subject: [PATCH 66/96] fix niambi_esteemed_speaker.txt --- forge-gui/res/cardsfolder/n/niambi_esteemed_speaker.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/n/niambi_esteemed_speaker.txt b/forge-gui/res/cardsfolder/n/niambi_esteemed_speaker.txt index a806b2e4135..00fd7226a0a 100755 --- a/forge-gui/res/cardsfolder/n/niambi_esteemed_speaker.txt +++ b/forge-gui/res/cardsfolder/n/niambi_esteemed_speaker.txt @@ -3,11 +3,12 @@ ManaCost:W U Types:Legendary Creature Human Cleric PT:2/1 K:Flash -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return another target creature you control to its owner's hand. If you do, you gain life equal to that creature's converted mana cost. -SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Creature.Other+YouCtrl | TgtPrompt$ Select another creature you control | SubAbility$ DBGainLife -SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, you may return another target creature you control to its owner's hand. If you do, you gain life equal to that creature's converted mana cost. +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Creature.Other+YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ You may select another creature you control | RememberChanged$ True | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ1 | LifeAmount$ X | References$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Targeted$CardManaCost DeckHas:Ability$LifeGain -A:AB$ Draw | Cost$ 1 W U T Discard<1/Card.Legendary> | NumCards$ 2 | SpellDescription$ Draw two cards. +A:AB$ Draw | Cost$ 1 W U T Discard<1/Card.Legendary/legendary> | NumCards$ 2 | SpellDescription$ Draw two cards. DeckHints:Type$Legendary Oracle:Flash\nWhen Niambi, Esteemed Speaker enters the battlefield, you may return another target creature you control to its owner's hand. If you do, you gain life equal to that creature's converted mana cost.\n{1}{W}{U}, {T}, Discard a legendary card: Draw two cards. From bb8bb49e5ed3fc90be7d8e563dc60526853d0bd5 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 21 Sep 2020 09:45:26 -0400 Subject: [PATCH 67/96] rollback bad fix --- forge-gui/res/cardsfolder/n/niambi_esteemed_speaker.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/n/niambi_esteemed_speaker.txt b/forge-gui/res/cardsfolder/n/niambi_esteemed_speaker.txt index 00fd7226a0a..93db0ed7422 100755 --- a/forge-gui/res/cardsfolder/n/niambi_esteemed_speaker.txt +++ b/forge-gui/res/cardsfolder/n/niambi_esteemed_speaker.txt @@ -3,10 +3,9 @@ ManaCost:W U Types:Legendary Creature Human Cleric PT:2/1 K:Flash -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, you may return another target creature you control to its owner's hand. If you do, you gain life equal to that creature's converted mana cost. -SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Creature.Other+YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ You may select another creature you control | RememberChanged$ True | SubAbility$ DBGainLife -SVar:DBGainLife:DB$ GainLife | Defined$ You | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ1 | LifeAmount$ X | References$ X | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return another target creature you control to its owner's hand. If you do, you gain life equal to that creature's converted mana cost. +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Creature.Other+YouCtrl | TgtPrompt$ Select another creature you control | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:Targeted$CardManaCost DeckHas:Ability$LifeGain A:AB$ Draw | Cost$ 1 W U T Discard<1/Card.Legendary/legendary> | NumCards$ 2 | SpellDescription$ Draw two cards. From 5312223a373ca07b556ad5c82324e4a6e885b080 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 21 Sep 2020 09:55:13 -0400 Subject: [PATCH 68/96] remove _ from ZNE editions file --- ...kar_Rising_Expeditions.txt => Zendikar Rising Expeditions.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename forge-gui/res/editions/{Zendikar_Rising_Expeditions.txt => Zendikar Rising Expeditions.txt} (100%) diff --git a/forge-gui/res/editions/Zendikar_Rising_Expeditions.txt b/forge-gui/res/editions/Zendikar Rising Expeditions.txt similarity index 100% rename from forge-gui/res/editions/Zendikar_Rising_Expeditions.txt rename to forge-gui/res/editions/Zendikar Rising Expeditions.txt From 3d9e458ab913559d6037b6c32dbe9339b9708e12 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 21 Sep 2020 10:12:43 -0400 Subject: [PATCH 69/96] spacing for select blocker prompt --- forge-gui/src/main/java/forge/match/input/InputBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/match/input/InputBlock.java b/forge-gui/src/main/java/forge/match/input/InputBlock.java index b3deff42243..dfc9977468e 100644 --- a/forge-gui/src/main/java/forge/match/input/InputBlock.java +++ b/forge-gui/src/main/java/forge/match/input/InputBlock.java @@ -86,7 +86,7 @@ public class InputBlock extends InputSyncronizedBase { } else { String attackerName = currentAttacker.isFaceDown() ? localizer.getMessage("lblMorph") : currentAttacker.getName() + " (" + currentAttacker.getId() + ")"; - String message = localizer.getMessage("lblSelectBlocker") + attackerName + localizer.getMessage("lblOrSelectBlockTarget"); + String message = localizer.getMessage("lblSelectBlocker") + attackerName + " " + localizer.getMessage("lblOrSelectBlockTarget"); showMessage(message); } From 9fea3a3cd087f900eeccdd1906de3ff2400e99b2 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 21 Sep 2020 11:09:01 -0400 Subject: [PATCH 70/96] reweave.txt use LKI and clean up StackDesc --- forge-gui/res/cardsfolder/r/reweave.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/r/reweave.txt b/forge-gui/res/cardsfolder/r/reweave.txt index 21103b71615..94d2ef7ca4c 100644 --- a/forge-gui/res/cardsfolder/r/reweave.txt +++ b/forge-gui/res/cardsfolder/r/reweave.txt @@ -2,10 +2,9 @@ Name:Reweave ManaCost:5 U Types:Instant Arcane K:Splice:Arcane:2 U U -A:SP$ Destroy | Cost$ 5 U | ValidTgts$ Permanent | Sacrifice$ True | SubAbility$ DBDigUntil | RememberDestroyed$ True | SpellDescription$ Target permanent's controller sacrifices it. If they do, that player reveals cards from the top of their library until they reveal a permanent card that shares a card type with the sacrificed permanent, puts that card onto the battlefield, then shuffles their library. -SVar:DBDigUntil:DB$ DigUntil | Defined$ TargetedController | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | Valid$ Permanent.sharesCardTypeWith Remembered | ValidDescription$ permanent card that shares a card type with the sacrificed permanent | FoundDestination$ Battlefield | RevealedDestination$ Library | Shuffle$ True | SubAbility$ DBCleanup +A:SP$ Destroy | Cost$ 5 U | ValidTgts$ Permanent | Sacrifice$ True | SubAbility$ DBDigUntil | RememberLKI$ True | StackDescription$ {p:TargetedController} destroys {c:Targeted}. If {p:TargetedController} does, | SpellDescription$ Target permanent's controller sacrifices it. If they do, that player reveals cards from the top of their library until they reveal a permanent card that shares a card type with the sacrificed permanent, puts that card onto the battlefield, then shuffles their library. +SVar:DBDigUntil:DB$ DigUntil | Defined$ RememberedController | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | Valid$ Permanent.sharesCardTypeWith Remembered | ValidDescription$ permanent card that shares a card type with the sacrificed permanent | FoundDestination$ Battlefield | RevealedDestination$ Library | Shuffle$ True | StackDescription$ they reveal cards from the top of their library until they reveal a permanent card that shares a card type with {c:Targeted}, put that card onto the battlefield, then shuffle their library. | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All DeckHints:Type$Arcane -SVar:Picture:http://www.wizards.com/global/images/magic/general/reweave.jpg Oracle:Target permanent's controller sacrifices it. If they do, that player reveals cards from the top of their library until they reveal a permanent card that shares a card type with the sacrificed permanent, puts that card onto the battlefield, then shuffles their library.\nSplice onto Arcane {2}{U}{U} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) From fcb65089380ec9ccd1b516df1660c883c0220c06 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 21 Sep 2020 13:35:40 -0400 Subject: [PATCH 71/96] rotation update --- forge-gui/res/formats/Casual/Brawl.txt | 4 ++-- forge-gui/res/formats/Digital/Historic.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 | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/forge-gui/res/formats/Casual/Brawl.txt b/forge-gui/res/formats/Casual/Brawl.txt index c2559cc7064..2730bf5e4c1 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:GRN, RNA, WAR, M20, ELD, THB, IKO, M21 -Banned:Drannith Magistrate; Golos, Tireless Pilgrim; Lutri, the Spellchaser; Oko, Thief of Crowns; Sorcerous Spyglass; Teferi, Time Raveler; Winota, Joiner of Forces; +Sets:ELD, THB, IKO, M21, ZNR +Banned:Drannith Magistrate; Lutri, the Spellchaser; Oko, Thief of Crowns; Sorcerous Spyglass; Winota, Joiner of Forces; diff --git a/forge-gui/res/formats/Digital/Historic.txt b/forge-gui/res/formats/Digital/Historic.txt index f7f64df5a78..5982278d88e 100644 --- a/forge-gui/res/formats/Digital/Historic.txt +++ b/forge-gui/res/formats/Digital/Historic.txt @@ -4,6 +4,6 @@ Type:Digital Subtype:Arena Effective:2019-11-21 Order:142 -Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AKR +Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AKR, ZNR Banned:Agent of Treachery; Burning-Tree Emissary; Field of the Dead; Fires of Invention; Oko, Thief of Crowns; Nexus of Fate; Once Upon a Time; Teferi, Time Raveler; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces #Suspended:Burning-Tree Emissary; Teferi, Time Raveler; Wilderness Reclamation diff --git a/forge-gui/res/formats/Sanctioned/Modern.txt b/forge-gui/res/formats/Sanctioned/Modern.txt index 129e1ae9f81..713333995fa 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, EVE, SHM, MOR, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, W17, HOU, XLN, RIX, DOM, M19, G18, GRN, RNA, WAR, MH1, M20, ELD, THB, IKO, M21 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, EVE, SHM, MOR, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, W17, HOU, XLN, RIX, DOM, M19, G18, GRN, RNA, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR 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; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Mox Opal; Mycosynth Lattice; Oko, Thief of Crowns; Once Upon A Time; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers diff --git a/forge-gui/res/formats/Sanctioned/Pioneer.txt b/forge-gui/res/formats/Sanctioned/Pioneer.txt index c2283a34319..bbcdb3e3904 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, EMN, KLD, AER, AKH, HOU, XLN, RIX, DOM, M19, GRN, RNA, WAR, M20, ELD, THB, IKO, M21 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, HOU, XLN, RIX, DOM, M19, GRN, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR Banned:Bloodstained Mire; Felidar Guardian; Field of the Dead; Flooded Strand; Inverter of Truth; Kethis, the Hidden Hand; Leyline of Abundance; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Smuggler's Copter; Underworld Breach; Veil of Summer; Walking Ballista; Windswept Heath; Wooded Foothills diff --git a/forge-gui/res/formats/Sanctioned/Standard.txt b/forge-gui/res/formats/Sanctioned/Standard.txt index efd1c5c7383..496a3967104 100644 --- a/forge-gui/res/formats/Sanctioned/Standard.txt +++ b/forge-gui/res/formats/Sanctioned/Standard.txt @@ -3,5 +3,5 @@ Name:Standard Order:101 Subtype:Standard Type:Sanctioned -Sets:GRN, RNA, WAR, M20, ELD, THB, IKO, M21 -Banned:Agent of Treachery; Cauldron Familiar; Field of the Dead; Fires of Invention; Growth Spiral; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Veil of Summer; Wilderness Reclamation +Sets:ELD, THB, IKO, M21, ZNR +Banned:Cauldron Familiar; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer From 03fc96dc87eae7b0740c3a911bd5de35d3ade97e Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 21 Sep 2020 13:50:10 -0400 Subject: [PATCH 72/96] ZNR blockdata --- forge-gui/res/blockdata/blocks.txt | 1 + forge-gui/res/blockdata/boosterboxes.txt | 3 ++- forge-gui/res/blockdata/fatpacks.txt | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/blockdata/blocks.txt b/forge-gui/res/blockdata/blocks.txt index 6909006ea72..f54b17e967c 100644 --- a/forge-gui/res/blockdata/blocks.txt +++ b/forge-gui/res/blockdata/blocks.txt @@ -90,3 +90,4 @@ Core Set 2021, 3/6/M21, M21 Jumpstart, -/2/JMP, Meta-Choose(S(JMP Above the Clouds 1)Above the Clouds 1;S(JMP Above the Clouds 2)Above the Clouds 2;S(JMP Above the Clouds 3)Above the Clouds 3;S(JMP Above the Clouds 4)Above the Clouds 4;S(JMP Angels 1)Angels 1;S(JMP Angels 2)Angels 2;S(JMP Archaeology 1)Archaeology 1;S(JMP Archaeology 2)Archaeology 2;S(JMP Archaeology 3)Archaeology 3;S(JMP Archaeology 4)Archaeology 4;;S(JMP Basri)Basri;S(JMP Cats 1)Cats 1;S(JMP Cats 2)Cats 2;S(JMP Chandra)Chandra;S(JMP Devilish 1)Devilish 1;S(JMP Devilish 2)Devilish 2;S(JMP Devilish 3)Devilish 3;S(JMP Devilish 4)Devilish 4;S(JMP Dinosaurs 1)Dinosaurs 1;S(JMP Dinosaurs 2)Dinosaurs 2;S(JMP Dinosaurs 3)Dinosaurs 3;S(JMP Dinosaurs 4)Dinosaurs 4;S(JMP Discarding 1)Discarding 1;S(JMP Discarding 2)Discarding 2;S(JMP Doctor 1)Doctor 1;S(JMP Doctor 2)Doctor 2;S(JMP Doctor 3)Doctor 3;S(JMP Doctor 4)Doctor 4;S(JMP Dogs 1)Dogs 1;S(JMP Dogs 2)Dogs 2;S(JMP Dragons 1)Dragons 1;S(JMP Dragons 2)Dragons 2;S(JMP Elves 1)Elves 1;S(JMP Elves 2)Elves 2;S(JMP Enchanted 1)Enchanted 1;S(JMP Enchanted 2)Enchanted 2;S(JMP Feathered Friends 1)Feathered Friends 1;S(JMP Feathered Friends 2)Feathered Friends 2;S(JMP Feathered Friends 3)Feathered Friends 3;S(JMP Feathered Friends 4)Feathered Friends 4;S(JMP Garruk)Garruk;S(JMP Goblins 1)Goblins 1;S(JMP Goblins 2)Goblins 2;S(JMP Goblins 3)Goblins 3;S(JMP Goblins 4)Goblins 4;S(JMP Heavily Armored 1)Heavily Armored 1;S(JMP Heavily Armored 2)Heavily Armored 2;S(JMP Heavily Armored 3)Heavily Armored 3;S(JMP Heavily Armored 4)Heavily Armored 4;S(JMP Lands 1)Lands 1;S(JMP Lands 2)Lands 2;S(JMP Legion 1)Legion 1;S(JMP Legion 2)Legion 2;S(JMP Legion 3)Legion 3;S(JMP Legion 4)Legion 4;S(JMP Lightning 1)Lightning 1;S(JMP Lightning 2)Lightning 2;S(JMP Liliana)Liliana;S(JMP Milling)Milling;S(JMP Minions 1)Minions 1;S(JMP Minions 2)Minions 2;S(JMP Minions 3)Minions 3;S(JMP Minions 4)Minions 4;S(JMP Minotaurs 1)Minotaurs 1;S(JMP Minotaurs 2)Minotaurs 2;S(JMP Phyrexian)Phyrexian;S(JMP Pirates 1)Pirates 1;S(JMP Pirates 2)Pirates 2;S(JMP Plus One 1)Plus One 1;S(JMP Plus One 2)Plus One 2;S(JMP Plus One 3)Plus One 3;S(JMP Plus One 4)Plus One 4;S(JMP Predatory 1)Predatory 1;S(JMP Predatory 2)Predatory 2;S(JMP Predatory 3)Predatory 3;S(JMP Predatory 4)Predatory 4;S(JMP Rainbow)Rainbow;S(JMP Reanimated 1)Reanimated 1;S(JMP Reanimated 2)Reanimated 2;S(JMP Reanimated 3)Reanimated 3;S(JMP Reanimated 4)Reanimated 4;S(JMP Rogues 1)Rogues 1;S(JMP Rogues 2)Rogues 2;S(JMP Seismic)Seismic;S(JMP Smashing 1)Smashing 1;S(JMP Smashing 2)Smashing 2;S(JMP Smashing 3)Smashing 3;S(JMP Smashing 4)Smashing 4;S(JMP Spellcasting 1)Spellcasting 1;S(JMP Spellcasting 2)Spellcasting 2;S(JMP Spellcasting 3)Spellcasting 3;S(JMP Spellcasting 4)Spellcasting 4;S(JMP Spirits 1)Spirits 1;S(JMP Spirits 2)Spirits 2;S(JMP Spooky 1)Spooky 1;S(JMP Spooky 2)Spooky 2;S(JMP Spooky 3)Spooky 3;S(JMP Spooky 4)Spooky 4;S(JMP Teferi)Teferi;S(JMP Tree Hugging 1)Tree Hugging 1;S(JMP Tree Hugging 2)Tree Hugging 2;S(JMP Tree Hugging 3)Tree Hugging 3;S(JMP Tree Hugging 4)Tree Hugging 4;S(JMP Under the Sea 1)Under the Sea 1;S(JMP Under the Sea 2)Under the Sea 2;S(JMP Unicorns)Unicorns;S(JMP Vampires 1)Vampires 1;S(JMP Vampires 2)Vampires 2;S(JMP Vampires 3)Vampires 3;S(JMP Vampires 4)Vampires 4;S(JMP Walls)Walls;S(JMP Well-Read 1)Well-Read 1;S(JMP Well-Read 2)Well-Read 2;S(JMP Well-Read 3)Well-Read 3;S(JMP Well-Read 4)Well-Read 4;S(JMP Witchcraft 1)Witchcraft 1;S(JMP Witchcraft 2)Witchcraft 2;S(JMP Wizards 1)Wizards 1;S(JMP Wizards 2)Wizards 2;S(JMP Wizards 3)Wizards 3;S(JMP Wizards 4)Wizards 4)Themes Amonkhet Remastered, 3/6/AKR, AKR Double Masters, 3/6/2XM, 2XM +Zendikar Rising, 3/6/ZNR, ZNR \ No newline at end of file diff --git a/forge-gui/res/blockdata/boosterboxes.txt b/forge-gui/res/blockdata/boosterboxes.txt index 175265439c1..b142fc60821 100644 --- a/forge-gui/res/blockdata/boosterboxes.txt +++ b/forge-gui/res/blockdata/boosterboxes.txt @@ -113,4 +113,5 @@ ELD: 36 Boosters THB: 36 Boosters MB1: 24 Boosters IKO: 36 Boosters -M21: 36 Boosters \ No newline at end of file +M21: 36 Boosters +ZNR: 36 Boosters \ No newline at end of file diff --git a/forge-gui/res/blockdata/fatpacks.txt b/forge-gui/res/blockdata/fatpacks.txt index 2b7569fbb43..8cea55a24af 100644 --- a/forge-gui/res/blockdata/fatpacks.txt +++ b/forge-gui/res/blockdata/fatpacks.txt @@ -79,4 +79,6 @@ THB: 10 Boosters, 40 BasicLands IKO: 10 Boosters, 40 BasicLands #needs to be 20 BasicLands, 20 Foil BasicLands, 1 Colossification+|IKO|3 M21: 10 Boosters, 40 BasicLands -#needs to be 20 BasicLands, 20 Foil BasicLands, 1 Pack Leader+|M21|3 \ No newline at end of file +#needs to be 20 BasicLands, 20 Foil BasicLands, 1 Pack Leader+|M21|3 +ZNR: 10 Boosters, 40 BasicLands +#needs to be 20 BasicLands, 20 Foil BasicLands, 1 Charix, the Raging Isle+|ZNR|3 \ No newline at end of file From 6fb14b35c31b58a3ccb66ed405a9e3f66be6d64b Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 21 Sep 2020 14:17:25 -0400 Subject: [PATCH 73/96] issue1584 --- forge-gui/res/editions/Masters 25.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Masters 25.txt b/forge-gui/res/editions/Masters 25.txt index d15953355df..041803b48aa 100644 --- a/forge-gui/res/editions/Masters 25.txt +++ b/forge-gui/res/editions/Masters 25.txt @@ -54,7 +54,7 @@ FoilChanceInBooster=100 43 U Blue Elemental Blast 44 R Blue Sun's Zenith 45 C Borrowing 100,000 Arrows -46 U Brainstorm +46 C Brainstorm 47 U Brine Elemental 48 C Choking Tethers 49 C Coralhelm Guide From c3b858e6974cc7cc336f7a361057a3c0908351af Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 21 Sep 2020 16:06:48 -0400 Subject: [PATCH 74/96] Fix capitalization of Combat tab in match view --- .../src/main/java/forge/screens/match/views/VCombat.java | 4 ++-- forge-gui/res/languages/de-DE.properties | 1 + forge-gui/res/languages/en-US.properties | 1 + forge-gui/res/languages/es-ES.properties | 1 + forge-gui/res/languages/it-IT.properties | 3 ++- forge-gui/res/languages/zh-CN.properties | 1 + 6 files changed, 8 insertions(+), 3 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VCombat.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VCombat.java index dfd7e67a2d7..82be2110926 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VCombat.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VCombat.java @@ -36,7 +36,7 @@ public class VCombat implements IVDoc { // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab(Localizer.getInstance().getMessage("lblCombat")); + private final DragTab tab = new DragTab(Localizer.getInstance().getMessage("lblCombatTab")); private final SkinnedTextArea tar = new SkinnedTextArea(); @@ -109,7 +109,7 @@ public class VCombat implements IVDoc { // No need to update this unless it's showing if (!this.equals(parentCell.getSelected())) { return; } - tab.setText(cntAttackers > 0 ? (Localizer.getInstance().getMessage("lblCombat") + " : " + cntAttackers) : Localizer.getInstance().getMessage("lblCombat")); + tab.setText(cntAttackers > 0 ? (Localizer.getInstance().getMessage("lblCombatTab") + " : " + cntAttackers) : Localizer.getInstance().getMessage("lblCombatTab")); tar.setText(desc); } } diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index f7ef60e3d03..5af68f0a69b 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -990,6 +990,7 @@ nlExperimentalNetworkCompatibility=Forge wechselt auf kompatiblen Netzwerk-Strea lblPlayers=Spieler lblLog=Bericht lblDev=Entw. +lblCombatTab=Kampf lblStack=Stapel lblMustWaitPriority=Warte auf Priorität... #FDeckEditor.java diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index ea286757045..2c743fb5dbb 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -990,6 +990,7 @@ nlExperimentalNetworkCompatibility=Forge switches to compatible network stream. lblPlayers=Players lblLog=Log lblDev=Dev +lblCombatTab=Combat lblStack=Stack lblMustWaitPriority=Must wait for priority... #FDeckEditor.java diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index 804e036e11d..9e5143195b8 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -990,6 +990,7 @@ nlExperimentalNetworkCompatibility=Forge switches to compatible network stream. lblPlayers=Jugadores lblLog=Log lblDev=Dev +lblCombatTab=Combate lblStack=Pila lblMustWaitPriority=Debes esperar debido a la prioridad... #FDeckEditor.java diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index a184ec1e714..535f977ad19 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -989,7 +989,8 @@ nlExperimentalNetworkCompatibility=Forge switches to compatible network stream. #MatchScreen.java lblPlayers=Giocatori lblLog=Login -lblDev=dev +lblDev=Dev +lblCombatTab=Combat lblStack=Pila lblMustWaitPriority=Devi aspettare la priorità ... #FDeckEditor.java diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 1e4e6252a5f..a97d928efaf 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -990,6 +990,7 @@ nlExperimentalNetworkCompatibility=Forge将切换为兼容性的网络流。( lblPlayers=玩家列表 lblLog=日志 lblDev=开发者工具 +lblCombatTab=战斗 lblStack=堆叠 lblMustWaitPriority=等待获得优先权 #FDeckEditor.java From 368036f890238f84ec091dd28c06251e5dbaec0f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Sep 2020 07:14:33 +0800 Subject: [PATCH 75/96] update description --- forge-core/src/main/java/forge/util/TextUtil.java | 5 +++-- .../src/main/java/forge/game/ability/effects/ManaEffect.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/forge-core/src/main/java/forge/util/TextUtil.java b/forge-core/src/main/java/forge/util/TextUtil.java index 4f5cc47eb44..c1479a43c86 100644 --- a/forge-core/src/main/java/forge/util/TextUtil.java +++ b/forge-core/src/main/java/forge/util/TextUtil.java @@ -302,7 +302,8 @@ public class TextUtil { } //Convert to Mana String public static String toManaString(String ManaProduced){ - String convertedMana = "{"+TextUtil.fastReplace(ManaProduced," ","}{")+"}"; - return TextUtil.fastReplace(convertedMana,"{Combo}{Any}", "X mana in any combination"); //Fix manamorphose stack descrition, todo: better/alternative method.. + if (ManaProduced == "mana"|| ManaProduced.contains("Combo")|| ManaProduced.contains("Any")) + return "mana";//fix manamorphose stack description and probably others.. + return "{"+TextUtil.fastReplace(ManaProduced," ","}{")+"}"; } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index 8ecbbe1d982..56ad0850a19 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -254,7 +254,7 @@ public class ManaEffect extends SpellAbilityEffect { final StringBuilder sb = new StringBuilder(); String mana = !sa.hasParam("Amount") || StringUtils.isNumeric(sa.getParam("Amount")) ? GameActionUtil.generatedMana(sa) : "mana"; - sb.append("Add ").append(mana == "mana" ? mana : toManaString(mana)).append("."); + sb.append("Add ").append(toManaString(mana)).append("."); return sb.toString(); } } From 07fe0d150189486553ec80a2ca1eb8f9385fca73 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Mon, 21 Sep 2020 08:32:54 +0200 Subject: [PATCH 76/96] ZNR: add vine_gecko with OnlyFirstSpell --- .../java/forge/game/card/CardPredicates.java | 13 +++++++++++++ .../src/main/java/forge/game/card/CardUtil.java | 15 ++------------- .../java/forge/game/cost/CostAdjustment.java | 16 +++++++++++++++- .../spellability/SpellAbilityPredicates.java | 11 +++++++++++ .../res/cardsfolder/upcoming/ZNR/vine_gecko.txt | 11 +++++++++++ 5 files changed, 52 insertions(+), 14 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/vine_gecko.txt diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index 6104f053fd2..63ee3b22f8b 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -456,6 +456,19 @@ public final class CardPredicates { }; } + public static final Predicate castSA(final Predicate predSA) { + return new Predicate() { + @Override + public boolean apply(final Card c) + { + if (c.getCastSA() == null) { + return false; + } + return predSA.apply(c.getCastSA()); + } + }; + } + public static class Presets { /** diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index b44445d3bfa..f917130d190 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -173,23 +173,12 @@ public final class CardUtil { } public static List getThisTurnCast(final String valid, final Card src) { - List res = Lists.newArrayList(); - final Game game = src.getGame(); - res.addAll(game.getStack().getSpellsCastThisTurn()); - - res = CardLists.getValidCardsAsList(res, valid, src.getController(), src); - - return res; + return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastThisTurn(), valid, src.getController(), src); } public static List getLastTurnCast(final String valid, final Card src) { - List res = Lists.newArrayList(); - final Game game = src.getGame(); - res.addAll(game.getStack().getSpellsCastLastTurn()); + return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastLastTurn(), valid, src.getController(), src); - res = CardLists.getValidCardsAsList(res, valid, src.getController(), src); - - return res; } /** diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index 0465c61f465..3ead5f27d1b 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -14,6 +14,7 @@ import forge.game.mana.ManaCostBeingPaid; import forge.game.player.Player; import forge.game.spellability.AbilityActivated; import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityPredicates; import forge.game.spellability.TargetChoices; import forge.game.staticability.StaticAbility; import forge.game.zone.Zone; @@ -423,6 +424,7 @@ public class CostAdjustment { final Player controller = hostCard.getController(); final Player activator = sa.getActivatingPlayer(); final Card card = sa.getHostCard(); + final Game game = hostCard.getGame(); if (st.hasParam("ValidCard") && !card.isValid(st.getParam("ValidCard").split(","), controller, hostCard, sa)) { @@ -452,7 +454,19 @@ public class CostAdjustment { if (activator == null ) { return false; } - List list = CardUtil.getThisTurnCast(st.getParam("ValidCard"), hostCard); + List list; + if (st.hasParam("ValidCard")) { + list = CardUtil.getThisTurnCast(st.getParam("ValidCard"), hostCard); + } else { + list = game.getStack().getSpellsCastThisTurn(); + } + + if (st.hasParam("ValidSpell")) { + list = CardLists.filterAsList(list, CardPredicates.castSA( + SpellAbilityPredicates.isValid(st.getParam("ValidSpell").split(","), controller, hostCard, sa)) + ); + } + if (CardLists.filterControlledBy(list, activator).size() > 0) { return false; } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java index 4f575371492..46865d5931a 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java @@ -4,6 +4,8 @@ import com.google.common.base.Predicate; import forge.game.CardTraitPredicates; import forge.game.ability.ApiType; +import forge.game.card.Card; +import forge.game.player.Player; public final class SpellAbilityPredicates extends CardTraitPredicates { public static final Predicate isApi(final ApiType type) { @@ -59,4 +61,13 @@ public final class SpellAbilityPredicates extends CardTraitPredicates { } }; } + + public static final Predicate isValid(String[] restrictions, Player sourceController, Card source, SpellAbility spellAbility) { + return new Predicate() { + @Override + public boolean apply(final SpellAbility sa) { + return sa.isValid(restrictions, sourceController, source, spellAbility); + } + }; + } } diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/vine_gecko.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/vine_gecko.txt new file mode 100644 index 00000000000..501694f3fc4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/vine_gecko.txt @@ -0,0 +1,11 @@ +Name:Vine Gecko +ManaCost:1 G +Types:Creature Elemental Lizard +PT:2/2 +S:Mode$ ReduceCost | OnlyFirstSpell$ True | Type$ Spell | ValidSpell$ Spell.Kicked | Activator$ You | Amount$ 1 | Description$ The first kicked spell you cast each turn costs {1} less to cast. +T:Mode$ SpellCast | ValidCard$ Card.kicked+YouCtrl | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a kicked spell, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:BuffedBy:Card.withKicker,Card.withMultikicker +DeckHas:Ability$Counters +Oracle:The first kicked spell you cast each turn costs {1} less to cast.\nWhenever you cast a kicked spell, put a +1/+1 counter on Vine Gecko. + From 612858a7e49d76a3d9b27d6677d5a600290c5d71 Mon Sep 17 00:00:00 2001 From: paul_snoops Date: Tue, 22 Sep 2020 13:11:20 +0100 Subject: [PATCH 77/96] Merfolk Windrobber would draw instead of mill when dealing combat damage --- forge-gui/res/cardsfolder/upcoming/ZNR/merfolk_windrobber.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/merfolk_windrobber.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/merfolk_windrobber.txt index a4162ace954..5b28122af0d 100755 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/merfolk_windrobber.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/merfolk_windrobber.txt @@ -4,7 +4,7 @@ Types:Creature Merfolk Rogue PT:1/1 K:Flying T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigMill | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player mills a card. -SVar:TrigMill:DB$ Draw | Defined$ TriggeredTarget | NumCards$ 1 +SVar:TrigMill:DB$ Mill | Defined$ TriggeredTarget | NumCards$ 1 A:AB$ Draw | Cost$ Sac<1/CARDNAME> | NumCards$ 1 | CheckSVar$ X | SVarCompare$ GE8 | References$ X | SpellDescription$ Draw a card. Activate this ability only if an opponent has eight or more cards in their graveyard. SVar:X:PlayerCountOpponents$HighestCardsInGraveyard DeckHas:Ability$Mill & Ability$Sacrifice From 43c425d8bd6c3428ee0d5b973c669c8e59c5e321 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Tue, 22 Sep 2020 21:24:58 +0800 Subject: [PATCH 78/96] try get UI language image from scryfall --- .../main/java/forge/util/ImageFetcher.java | 55 ++++++++++++++----- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java index d3cbcc74a55..e55ed9ac0a2 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -21,6 +21,22 @@ import forge.properties.ForgePreferences; public abstract class ImageFetcher { private static final ExecutorService threadPool = Executors.newCachedThreadPool(); + // see https://scryfall.com/docs/api/languages and + // https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes + private static final HashMap langCodeMap = new HashMap<>(); + static { + langCodeMap.put("en-US", "en"); + langCodeMap.put("es-ES", "es"); + langCodeMap.put("fr-FR", "fr"); + langCodeMap.put("de-DE", "de"); + langCodeMap.put("it-IT", "it"); + langCodeMap.put("pt-BR", "pt"); + langCodeMap.put("ja-JP", "ja"); + langCodeMap.put("ko-KR", "ko"); + langCodeMap.put("ru-RU", "ru"); + langCodeMap.put("zh-CN", "zhs"); + langCodeMap.put("zh-HK", "zht"); + }; private HashMap> currentFetches = new HashMap<>(); private HashMap tokenImages; @@ -47,41 +63,49 @@ public abstract class ImageFetcher { final String filename = ImageUtil.getImageKey(paperCard, backFace, true); destFile = new File(ForgeConstants.CACHE_CARD_PICS_DIR + "/" + filename + ".jpg"); - // First try to download the LQ Set URL, then fetch from scryfall - StringBuilder setDownload = new StringBuilder(ForgeConstants.URL_PIC_DOWNLOAD); - setDownload.append(ImageUtil.getDownloadUrl(paperCard, backFace)); - downloadUrls.add(setDownload.toString()); - int artIndex = 1; - final Pattern pattern = Pattern.compile( - "^.:([^|]*\\|){2}(\\d+).*$" - ); + final Pattern pattern = Pattern.compile("^.:([^|]*\\|){2}(\\d+).*$"); Matcher matcher = pattern.matcher(imageKey); if (matcher.matches()) { artIndex = Integer.parseInt(matcher.group(2)); } final StaticData data = StaticData.instance(); - final String cardNum = data.getCommonCards().getCardCollectorNumber(paperCard.getName(), paperCard.getEdition(), artIndex); - if (cardNum != null) { + final String cardNum = data.getCommonCards().getCardCollectorNumber(paperCard.getName(), + paperCard.getEdition(), artIndex); + if (cardNum != null) { String suffix = ""; if (paperCard.getRules().getOtherPart() != null) { suffix = (backFace ? "b" : "a"); } final String editionMciCode = data.getEditions().getMciCodeByCode(paperCard.getEdition()); - //see https://scryfall.com/blog 2020/8/6, and https://scryfall.com/docs/api/cards/collector - downloadUrls.add(String.format("https://api.scryfall.com/cards/%s/%s%s/en?format=image&version=normal", editionMciCode, cardNum, suffix)); + String langCode = "en"; + String UILang = FModel.getPreferences().getPref(ForgePreferences.FPref.UI_LANGUAGE); + if (langCodeMap.containsKey(UILang)) { + langCode = langCodeMap.get(UILang); + } + // see https://scryfall.com/blog 2020/8/6, and + // https://scryfall.com/docs/api/cards/collector + downloadUrls.add(String.format("https://api.scryfall.com/cards/%s/%s%s/%s?format=image&version=normal", + editionMciCode, cardNum, suffix, langCode)); } + + StringBuilder setDownload = new StringBuilder(ForgeConstants.URL_PIC_DOWNLOAD); + setDownload.append(ImageUtil.getDownloadUrl(paperCard, backFace)); + downloadUrls.add(setDownload.toString()); + } else if (prefix.equals(ImageKeys.TOKEN_PREFIX)) { if (tokenImages == null) { tokenImages = new HashMap<>(); - for (Pair nameUrlPair : FileUtil.readNameUrlFile(ForgeConstants.IMAGE_LIST_TOKENS_FILE)) { + for (Pair nameUrlPair : FileUtil + .readNameUrlFile(ForgeConstants.IMAGE_LIST_TOKENS_FILE)) { tokenImages.put(nameUrlPair.getLeft(), nameUrlPair.getRight()); } } final String filename = imageKey.substring(2) + ".jpg"; String tokenUrl = tokenImages.get(filename); if (tokenUrl == null) { - System.err.println("No specified file for '" + filename + "'.. Attempting to download from default Url"); + System.err + .println("No specified file for '" + filename + "'.. Attempting to download from default Url"); tokenUrl = String.format("%s%s", ForgeConstants.URL_TOKEN_DOWNLOAD, filename); } destFile = new File(ForgeConstants.CACHE_TOKEN_PICS_DIR, filename); @@ -94,7 +118,8 @@ public abstract class ImageFetcher { } if (destFile.exists()) { - // TODO: Figure out why this codepath gets reached. Ideally, fetchImage() wouldn't + // TODO: Figure out why this codepath gets reached. Ideally, fetchImage() + // wouldn't // be called if we already have the image. return; } From b3aed3a919de68b9984f40b6e41b61e2bceb19a8 Mon Sep 17 00:00:00 2001 From: Andreas Bendel Date: Tue, 22 Sep 2020 18:06:57 +0000 Subject: [PATCH 79/96] Update de-DE.properties --- forge-gui/res/languages/de-DE.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 5585be9486b..e5e3e3dbdd1 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -183,8 +183,8 @@ nlEnableMusic=Hintergrundmusik während des Spiels nlAltSoundSystem=Nutze alternatives Sound-System (nur nutzen, wenn es Probleme mit fehlenden Geräuschen gibt) nlSrOptimize=Setze verschiedene Optionen, um Forge besser für Screenreader lesbar zu machen KeyboardShortcuts=Tastenkombinationen -cbpLandPlayed=Land entering battlefield notifications -nlpLandPlayed=Choose when you want to get visual notifications for a land entering the battlefield: Never, always, or only for the lands entering a battlefield because of an action of a AI player +cbpLandPlayed=Land-kommt-ins-Spiel-Benachrichtigung +nlpLandPlayed=Wenn ein Land auf das Spielfeld kommt, wann möchtest du eine Benachrichtigung bekommen: Niemals, immer oder nur bei Aktionen der KI? #VSubmenuAchievements.java lblAchievements=Errungenschaften #VSubmenuDownloaders.java From 7e398fb9f611caf454d051b891248bc4242c5ad1 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 22 Sep 2020 14:14:19 -0400 Subject: [PATCH 80/96] Commander Legends.txt ed file --- forge-gui/res/editions/Commander Legends.txt | 34 ++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 forge-gui/res/editions/Commander Legends.txt diff --git a/forge-gui/res/editions/Commander Legends.txt b/forge-gui/res/editions/Commander Legends.txt new file mode 100644 index 00000000000..43310a37422 --- /dev/null +++ b/forge-gui/res/editions/Commander Legends.txt @@ -0,0 +1,34 @@ +[metadata] +Code=CMR +Date=2020-11-11 +Name=Commander Legends +Type=Other + +[cards] +1 C The Prismatic Piper +27 R Keeper of the Accord +149 R Sengir, the Dark Baron +160 U Alena, Kessig Trapper +231 U Halana, Kessig Ranger +306 C Commander's Sphere +350 C Command Tower +354 R Rejuvenating Springs +356 R Spectator Seating +358 R Training Center +359 R Undergrowth Stadium +360 R Vault of Champions +530 M Prossh, Skyraider of Kher +546 C The Prismatic Piper +568 R Sengir, the Dark Baron +570 U Alena, Kessig Trapper +579 U Halana, Kessig Ranger +621 R Keeper of the Accord +693 C Commander's Sphere +705 C Command Tower +709 R Rejuvenating Springs +711 R Spectator Seating +713 R Training Center +714 R Undergrowth Stadium +715 R Vault of Champions +721 M Mana Confluence +722 R Sengir, the Dark Baron From 345140746803bd862318a7cf01fa264ba0718450 Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Tue, 22 Sep 2020 18:23:23 +0000 Subject: [PATCH 81/96] ZNR 18 Sep --- .../bala_ged_recovery_bala_ged_sanctuary.txt | 16 +++++++++++++++ .../upcoming/ZNR/kazandu_stomper.txt | 8 ++++++++ .../ZNR/khalni_ambush_khalni_territory.txt | 16 +++++++++++++++ .../upcoming/ZNR/murasa_sproutling.txt | 9 +++++++++ .../upcoming/ZNR/nissas_zendikon.txt | 9 +++++++++ .../upcoming/ZNR/oran_rief_ooze.txt | 11 ++++++++++ .../upcoming/ZNR/pyroclastic_hellion.txt | 4 ++-- .../upcoming/ZNR/reclaim_the_wastes.txt | 7 +++++++ .../upcoming/ZNR/scale_the_heights.txt | 10 ++++++++++ .../cardsfolder/upcoming/ZNR/scute_swarm.txt | 12 +++++++++++ .../upcoming/ZNR/skyclave_pick_axe.txt | 11 ++++++++++ .../upcoming/ZNR/strength_of_solidarity.txt | 9 +++++++++ ...r_symbiosis_turntimber_serpentine_wood.txt | 20 +++++++++++++++++++ .../upcoming/ZNR/veteran_adventurer.txt | 10 ++++++++++ 14 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/bala_ged_recovery_bala_ged_sanctuary.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_stomper.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/khalni_ambush_khalni_territory.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/murasa_sproutling.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/nissas_zendikon.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/oran_rief_ooze.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/reclaim_the_wastes.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/scale_the_heights.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/scute_swarm.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_pick_axe.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/strength_of_solidarity.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_symbiosis_turntimber_serpentine_wood.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/ZNR/veteran_adventurer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/bala_ged_recovery_bala_ged_sanctuary.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/bala_ged_recovery_bala_ged_sanctuary.txt new file mode 100644 index 00000000000..ab86241ed2b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/bala_ged_recovery_bala_ged_sanctuary.txt @@ -0,0 +1,16 @@ +Name:Bala Ged Recovery +ManaCost:2 G +Types:Sorcery +A:SP$ ChangeZone | Cost$ 2 G | ValidTgts$ Card.YouOwn | TgtPrompt$ Select target card | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target card from your graveyard to your hand. +DeckHas:Ability$Graveyard +AlternateMode:Modal +Oracle:Return target card from your graveyard to your hand. + +ALTERNATE + +Name:Bala Ged Sanctuary +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +Oracle:Bala Ged Sanctuary enters the battlefield tapped.\n{T}: Add {G}. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_stomper.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_stomper.txt new file mode 100755 index 00000000000..056f6841d7d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_stomper.txt @@ -0,0 +1,8 @@ +Name:Kazandu Stomper +ManaCost:5 G +Types:Creature Beast +PT:6/5 +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return up to two lands you control to their owner's hand. +SVar:TrigChangeZone:DB$ ChangeZone | PrimaryPrompt$ Choose up to two lands you control | ChangeNum$ 2 | ChangeType$ Land.YouCtrl | Origin$ Battlefield | Destination$ Hand | Hidden$ True +Oracle:Trample\nWhen Kazandu Stomper enters the battlefield, return up to two lands you control to their owner's hand. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/khalni_ambush_khalni_territory.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/khalni_ambush_khalni_territory.txt new file mode 100644 index 00000000000..93d4b297755 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/khalni_ambush_khalni_territory.txt @@ -0,0 +1,16 @@ +Name:Khalni Ambush +ManaCost:2 G +Types:Instant +A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature.YouCtrl | AILogic$ Fight | TgtPrompt$ Choose target creature you control | StackDescription$ None | SubAbility$ DBFight | SpellDescription$ Target creature you control fights target creature you don't control. (Each deals damage equal to its power to the other.) +SVar:DBFight:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose target creature you don't control +AlternateMode:Modal +Oracle:Target creature you control fights target creature you don't control. (Each deals damage equal to its power to the other.) + +ALTERNATE + +Name:Khalni Territory +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +Oracle:Khalni Territory enters the battlefield tapped.\n{T}: Add {G}. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/murasa_sproutling.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/murasa_sproutling.txt new file mode 100755 index 00000000000..fd2d841a221 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/murasa_sproutling.txt @@ -0,0 +1,9 @@ +Name:Murasa Sproutling +ManaCost:2 G +Types:Creature Plant Elemental +PT:3/3 +K:Kicker:1 G +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, return target card with a kicker ability from your graveyard to your hand. +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target card with a kicker ability | ValidTgts$ Card.withKicker+YouOwn,Card.withMultikicker+YouOwn +DeckHas:Ability$Graveyard +Oracle:Kicker {1}{G} (You may pay an additional {1}{G} as you cast this spell.)\nWhen Murasa Sproutling enters the battlefield, if it was kicked, return target card with a kicker ability from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nissas_zendikon.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/nissas_zendikon.txt new file mode 100755 index 00000000000..c69b8603e89 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/nissas_zendikon.txt @@ -0,0 +1,9 @@ +Name:Nissa's Zendikon +ManaCost:3 G +Types:Enchantment Aura +K:Enchant land +A:SP$ Attach | Cost$ 3 G | ValidTgts$ Land | AILogic$ Animate +S:Mode$ Continuous | Affected$ Land.AttachedBy | SetPower$ 4 | SetToughness$ 4 | AddType$ Creature & Elemental | AddKeyword$ Reach & Haste | Description$ Enchanted land is a 4/4 Elemental creature with reach and haste. It's still a land. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigChangeZone | TriggerDescription$ When enchanted land dies, return that card to its owner's hand. +SVar:TrigChangeZone:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Hand +Oracle:Enchant land\nEnchanted land is a 4/4 Elemental creature with reach and haste. It's still a land.\nWhen enchanted land dies, return that card to its owner's hand. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/oran_rief_ooze.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/oran_rief_ooze.txt new file mode 100755 index 00000000000..944ad67f36d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/oran_rief_ooze.txt @@ -0,0 +1,11 @@ +Name:Oran-Rief Ooze +ManaCost:2 G +Types:Creature Ooze +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, put a +1/+1 counter on target creature you control. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 +T:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ TrigPutCounterAll | TriggerDescription$ Whenever CARDNAME attacks, put a +1/+1 counter on each attacking creature with a +1/+1 counter on it. +SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.attacking+counters_GE1_P1P1 | CounterType$ P1P1 | CounterNum$ 1 +SVar:HasAttackEffect:TRUE +DeckHas:Ability$Counters +Oracle:When Oran-Rief Ooze enters the battlefield, put a +1/+1 counter on target creature you control.\nWhenever Oran-Rief Ooze attacks, put a +1/+1 counter on each attacking creature with a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt index 4da03ba978d..65f3c866064 100644 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt @@ -4,7 +4,7 @@ Types:Creature Hellion PT:4/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, you may return a land you control to its owner's hand. SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Hidden$ True | ChangeType$ Land.YouCtrl | ChangeNum$ 1 | SubAbility$ DBImmediateTrigger | RememberChanged$ True | SelectPrompt$ You may choose a land you control to return to its owner's hand -SVar:DBImmediateTrigger:DB$ ImmediateTrigger | RememberObjects$ RememberedCard | ConditionDefined$ Remembered | ConditionPresent$ Card | Execute$ TrigDamage | TriggerDescription$ When you do, CARDNAME deals 2 damage to each opponent. -SVar:TrigDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 2 | SubAbility$ DBCleanup +SVar:DBImmediateTrigger:DB$ ImmediateTrigger | RememberObjects$ RememberedCard | ConditionDefined$ Remembered | ConditionPresent$ Card | Execute$ TrigDamage | SubAbility$ DBCleanup | TriggerDescription$ When you do, CARDNAME deals 2 damage to each opponent. +SVar:TrigDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 2 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:When Pyroclastic Hellion enters the battlefield, you may return a land you control to its owner's hand. When you do, Pyroclastic Hellion deals 2 damage to each opponent. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/reclaim_the_wastes.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/reclaim_the_wastes.txt new file mode 100755 index 00000000000..8da72fc7a02 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/reclaim_the_wastes.txt @@ -0,0 +1,7 @@ +Name:Reclaim the Wastes +ManaCost:G +Types:Sorcery +K:Kicker:3 +A:SP$ ChangeZone | Cost$ G | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeTypeDesc$ basic land | ChangeNum$ X | References$ X | SpellDescription$ Search your library for a basic land card, reveal that card, put it into your hand, then shuffle your library. If this spell was kicked, search your library for two basic land cards instead of one. +SVar:X:Count$Kicked.2.1 +Oracle:Kicker {3} (You may pay an additional {3} as you cast this spell.)\nSearch your library for a basic land card, reveal it, put it into your hand, then shuffle your library. If this spell was kicked, search your library for two basic land cards instead of one. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/scale_the_heights.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/scale_the_heights.txt new file mode 100755 index 00000000000..875db2b69ee --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/scale_the_heights.txt @@ -0,0 +1,10 @@ +Name:Scale the Heights +ManaCost:2 G +Types:Sorcery +A:SP$ PutCounter | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select up to one target creature | CounterType$ P1P1 | CounterNum$ 1 | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBGainLife | SpellDescription$ Put a +1/+1 counter on up to one target creature. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 | SubAbility$ DBEffect | SpellDescription$ You gain 2 life. +SVar:DBEffect:DB$ Effect | StaticAbilities$ LandPlay | AILogic$ Always | SubAbility$ DBDraw | SpellDescription$ You may play an additional land this turn. +SVar:LandPlay:Mode$ Continuous | Affected$ You | AdjustLandPlays$ 1 | EffectZone$ Command | Description$ You may play an additional land this turn. +SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. +DeckHas:Ability$Counters & Ability$LifeGain +Oracle:Put a +1/+1 counter on up to one target creature. You gain 2 life. You may play an additional land this turn.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/scute_swarm.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/scute_swarm.txt new file mode 100755 index 00000000000..a33e408a7bc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/scute_swarm.txt @@ -0,0 +1,12 @@ +Name:Scute Swarm +ManaCost:2 G +Types:Creature Insect +PT:1/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigBranch | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, create a 1/1 green Insect creature token. If you control six or more lands, create a token that's a copy of CARDNAME instead. +SVar:TrigBranch:DB$ Branch | References$ X | BranchConditionSVar$ X | BranchConditionSVarCompare$ GE6 | TrueSubAbility$ DBCopy | FalseSubAbility$ DBToken +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ g_1_1_insect | TokenOwner$ You +SVar:DBCopy:DB$ CopyPermanent | Defined$ Self | NumCopies$ 1 +SVar:X:Count$Valid Land.YouCtrl +DeckHas:Ability$Token +SVar:BuffedBy:Land +Oracle:Landfall — Whenever a land enters the battlefield under your control, create a 1/1 green Insect creature token. If you control six or more lands, create a token that's a copy of Scute Swarm instead. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_pick_axe.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_pick_axe.txt new file mode 100755 index 00000000000..67d096c6630 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_pick_axe.txt @@ -0,0 +1,11 @@ +Name:Skyclave Pick-Axe +ManaCost:G +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When CARDNAME enters the battlefield, attach it to target creature you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, equipped creature gets +2/+2 until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Equipped | NumAtt$ 2 | NumDef$ 2 +K:Equip:2 G +SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield +SVar:BuffedBy:Land +Oracle:Skyclave Pick-Axe enters the battlefield, attach it to target creature you control.\nLandfall — Whenever a land enters the battlefield under your control, equipped creature gets +2/+2 until end of turn.\nEquip {2}{G} diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/strength_of_solidarity.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/strength_of_solidarity.txt new file mode 100755 index 00000000000..e11aa4e862e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/strength_of_solidarity.txt @@ -0,0 +1,9 @@ +Name:Strength of Solidarity +ManaCost:G +Types:Sorcery +A:SP$ PutCounter | Cost$ G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ X | References$ X | SpellDescription$ Choose target creature you control. Put a +1/+1 counter on it for each creature in your party. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.) +DeckHas:Ability$Party & Ability$Counters +DeckHints:Type$Cleric|Rogue|Warrior|Wizard +SVar:X:Count$Party +SVar:NeedsToPlayVar:X GE1 +Oracle:Choose target creature you control. Put a +1/+1 counter on it for each creature in your party. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_symbiosis_turntimber_serpentine_wood.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_symbiosis_turntimber_serpentine_wood.txt new file mode 100644 index 00000000000..0b32f6f3ce1 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_symbiosis_turntimber_serpentine_wood.txt @@ -0,0 +1,20 @@ +Name:Turntimber Symbiosis +ManaCost:4 G G G +Types:Sorcery +A:SP$ Dig | Cost$ 4 G G G | DigNum$ 7 | ChangeNum$ 1 | Optional$ True | ForceRevealToController$ True | ChangeValid$ Creature | PrimaryPrompt$ You may choose a creature card to put on the battlefield | DestinationZone$ Library | LibraryPosition$ 0 | RememberChanged$ True | RestRandomOrder$ True | SubAbility$ DBChangeZone | StackDescription$ SpellDescription | SpellDescription$ Look at the top seven cards of your library. You may put a creature card from among them onto the battlefield. If that creature card has converted mana cost 3 or less, it enters with three additional +1/+1 counters on it. Put the rest on the bottom of your library in a random order. +SVar:DBChangeZone:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ Remembered | ConditionDefined$ Remembered | ConditionPresent$ Creature.cmcGT3 | SubAbility$ DBChangeZone2 +SVar:DBChangeZone2:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | WithCounters$ P1P1_3 | Defined$ Remembered | ConditionDefined$ Remembered | ConditionPresent$ Creature.cmcLE3 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +AlternateMode:Modal +DeckHas:Ability$Counters +Oracle:Look at the top seven cards of your library. You may put a creature card from among them onto the battlefield. If that creature card has converted mana cost 3 or less, it enters with three additional +1/+1 counters on it. Put the rest on the bottom of your library in a random order. + +ALTERNATE + +Name:Turntimber, Serpentine Wood +ManaCost:no cost +Types:Land +K:ETBReplacement:Other:DBTap +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<3> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +Oracle:As Turntimber, Serpentine Wood enters the battlefield, you may pay 3 life. If you don’t, it enters the battlefield tapped.\n{T}: Add {G}. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/veteran_adventurer.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/veteran_adventurer.txt new file mode 100755 index 00000000000..18cd0863918 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/veteran_adventurer.txt @@ -0,0 +1,10 @@ +Name:Veteran Adventurer +ManaCost:5 G +Types:Creature Human +PT:5/5 +K:Vigilance +S:Mode$ Continuous | EffectZone$ All | Affected$ Card.Self | CharacteristicDefining$ True | AddType$ Cleric & Rogue & Warrior & Wizard | Description$ CARDNAME is also a Cleric, Rogue, Warrior, and Wizard. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | References$ X | Description$ This spell costs {1} less to cast for each creature in your party. +DeckHints:Ability$Party & Type$Cleric|Rogue|Warrior|Wizard +SVar:X:Count$Party +Oracle:Veteran Adventurer is also a Cleric, Rogue, Warrior, and Wizard.\nThis spell costs {1} less to cast for each creature in your party.\nVigilance From 521bb8212ef0eeb4c534d5060bc97b38de030b79 Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Tue, 22 Sep 2020 18:24:33 +0000 Subject: [PATCH 82/96] ZNC 21 Sep --- .../java/forge/game/ability/effects/GoadEffect.java | 6 ++---- .../upcoming/ZNC/anowon_the_ruin_thief.txt | 13 +++++++++++++ .../res/cardsfolder/upcoming/ZNC/enigma_thief.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/ZNC/geode_rager.txt | 9 +++++++++ .../upcoming/ZNC/obuun_mul_daya_ancestor.txt | 12 ++++++++++++ .../res/cardsfolder/upcoming/ZNC/trove_warden.txt | 12 ++++++++++++ .../upcoming/ZNC/whispersteel_dagger.txt | 9 +++++++++ .../res/editions/Zendikar Rising Commander.txt | 13 +++++++++++++ 8 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNC/anowon_the_ruin_thief.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNC/enigma_thief.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNC/geode_rager.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNC/obuun_mul_daya_ancestor.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNC/trove_warden.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ZNC/whispersteel_dagger.txt create mode 100644 forge-gui/res/editions/Zendikar Rising Commander.txt diff --git a/forge-game/src/main/java/forge/game/ability/effects/GoadEffect.java b/forge-game/src/main/java/forge/game/ability/effects/GoadEffect.java index ae1cdb689ee..3080170b353 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/GoadEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/GoadEffect.java @@ -6,26 +6,24 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; public class GoadEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { - final TargetRestrictions tgt = sa.getTargetRestrictions(); final Player player = sa.getActivatingPlayer(); final Game game = player.getGame(); final long timestamp = game.getNextTimestamp(); - for (final Card tgtC : getTargetCards(sa)) { + for (final Card tgtC : getDefinedCardsOrTargeted(sa)) { // only pump things in PumpZone if (!game.getCardsIn(ZoneType.Battlefield).contains(tgtC)) { continue; } // if pump is a target, make sure we can still target now - if ((tgt != null) && !tgtC.canBeTargetedBy(sa)) { + if (sa.usesTargeting() && !sa.getTargetRestrictions().canTgtPlayer() && !tgtC.canBeTargetedBy(sa)) { continue; } diff --git a/forge-gui/res/cardsfolder/upcoming/ZNC/anowon_the_ruin_thief.txt b/forge-gui/res/cardsfolder/upcoming/ZNC/anowon_the_ruin_thief.txt new file mode 100644 index 00000000000..28f04968100 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNC/anowon_the_ruin_thief.txt @@ -0,0 +1,13 @@ +Name:Anowon, the Ruin Thief +ManaCost:2 U B +Types:Legendary Creature Vampire Rogue +PT:2/4 +S:Mode$ Continuous | Affected$ Rogue.Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Rogues you control get +1/+1. +T:Mode$ DamageDoneOnce | CombatDamage$ True | ValidSource$ Rogue.YouCtrl | ValidTarget$ Player | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever one or more Rogues you control deal combat damage to a player, that player mills a card for each 1 damage dealt to them. If the player mills at least one creature card this way, you draw a card. (To mill a card, a player puts the top card of their library into their graveyard.) +SVar:TrigMill:DB$ Mill | Defined$ TriggeredTarget | NumCards$ X | References$ X | RememberMilled$ True | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Creature | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:TriggerCount$DamageAmount +DeckNeeds:Type$Rogue +DeckHas:Ability$Mill +Oracle:Other Rogues you control get +1/+1.\nWhenever one or more Rogues you control deal combat damage to a player, that player mills a card for each 1 damage dealt to them. If the player mills at least one creature card this way, you draw a card. (To mill a card, a player puts the top card of their library into their graveyard.) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNC/enigma_thief.txt b/forge-gui/res/cardsfolder/upcoming/ZNC/enigma_thief.txt new file mode 100644 index 00000000000..3aca4b281db --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNC/enigma_thief.txt @@ -0,0 +1,10 @@ +Name:Enigma Thief +ManaCost:5 U U +Types:Creature Sphinx Rogue +PT:5/5 +K:Prowl:3 U +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ReturnOneEach | TriggerDescription$ When CARDNAME enters the battlefield, for each opponent, return up to one target nonland permanent that player controls to its owner’s hand. +SVar:ReturnOneEach:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Permanent.nonLand+OppCtrl | TargetMin$ 0 | TargetMax$ OneEach | References$ OneEach | TargetsWithDifferentControllers$ True | TgtPrompt$ Select up to one target nonland permanent each opponent controls +SVar:OneEach:PlayerCountOpponents$Amount +Oracle:Prowl {3}{U} (You may cast this spell for its prowl cost if you dealt combat damage to a player this turn with a Sphinx or a Rogue.)\nFlying\nWhen Enigma Thief enters the battlefield, for each opponent, return up to one target nonland permanent that player controls to its owner’s hand. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNC/geode_rager.txt b/forge-gui/res/cardsfolder/upcoming/ZNC/geode_rager.txt new file mode 100644 index 00000000000..27857b961be --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNC/geode_rager.txt @@ -0,0 +1,9 @@ +Name:Geode Rager +ManaCost:4 R R +Types:Creature Elemental +PT:4/3 +K:First Strike +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGoad | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, goad each creature target player controls. (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.) +SVar:TrigGoad:DB$ Goad | ValidTgts$ Player | TgtPrompt$ Select target player | Defined$ Valid Creature.ControlledBy TargetedPlayer +SVar:BuffedBy:Land +Oracle:First strike\nLandfall — Whenever a land enters the battlefield under your control, goad each creature target player controls. (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNC/obuun_mul_daya_ancestor.txt b/forge-gui/res/cardsfolder/upcoming/ZNC/obuun_mul_daya_ancestor.txt new file mode 100644 index 00000000000..92613f47e74 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNC/obuun_mul_daya_ancestor.txt @@ -0,0 +1,12 @@ +Name:Obuun, Mul Daya Ancestor +ManaCost:1 R G W +Types:Legendary Creature Elf Spirit +PT:3/3 +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ At the beginning of combat on your turn, up to one target land you control becomes an X/X Elemental creature with trample and haste until end of turn, where X is CARDNAME’s power. It’s still a land. +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land.YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target land you control | Power$ X | Toughness$ X | References$ X | Types$ Elemental,Creature | Keywords$ Trample & Haste +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, put a +1/+1 counter on target creature. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 +SVar:X:Count$CardPower +DeckHas:Ability$Counters +SVar:BuffedBy:Land +Oracle:At the beginning of combat on your turn, up to one target land you control becomes an X/X Elemental creature with trample and haste until end of turn, where X is Obuun’s power. It’s still a land.\nLandfall — Whenever land enters the battlefield under your control, put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNC/trove_warden.txt b/forge-gui/res/cardsfolder/upcoming/ZNC/trove_warden.txt new file mode 100644 index 00000000000..46805d78d72 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNC/trove_warden.txt @@ -0,0 +1,12 @@ +Name:Trove Warden +ManaCost:2 W W +Types:Creature Cat Beast +PT:3/4 +K:Vigilance +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, exile target permanent card with converted mana cost 3 or less from your graveyard. +SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Permanent.YouOwn+cmcLE3 | TgtPrompt$ | Select target permanent card with converted mana cost 3 or less from your graveyard | Origin$ Graveyard | Destination$ Exile +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigReturn | TriggerDescription$ When CARDNAME dies, put each permanent card exiled with it onto the battlefield under the control of that card’s owner. +SVar:TrigReturn:DB$ ChangeZoneAll | ChangeType$ Permanent.ExiledWithSource | Origin$ Exile | Destination$ Battlefield +DeckHas:Ability$Graveyard +SVar:BuffedBy:Land +Oracle:Landfall — Whenever a land enters the battlefield under your control, exile target permanent card with converted mana cost 3 or less from your graveyard.\nWhen Trove Warden dies, put each permanent card exiled with it onto the battlefield under the control of that card’s owner. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNC/whispersteel_dagger.txt b/forge-gui/res/cardsfolder/upcoming/ZNC/whispersteel_dagger.txt new file mode 100644 index 00000000000..1ef375e69b7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ZNC/whispersteel_dagger.txt @@ -0,0 +1,9 @@ +Name:Whispersteel Dagger +ManaCost:2 B +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | Description$ Equipped creature gets +2/+0. +T:Mode$ DamageDone | CombatDamage$ True | ValidSource$ Creature.EquippedBy | ValidTarget$ Player | OptionalDecider$ You | Execute$ TrigEffect | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, you may cast a creature spell from that player’s graveyard this turn, and you may spend mana as though it were mana of any color to cast that spell. +SVar:TrigEffect:DB$ Effect | StaticAbilities$ MayCastGrave | RememberObjects$ TriggeredTarget +SVar:MayCastGrave:Mode$ Continuous | Affected$ Creature.RememberedPlayerCtrl | MayPlay$ True | MayPlayLimit$ 1 | MayPlayIgnoreType$ True | EffectZone$ Command | AffectedZone$ Graveyard | Description$ You may cast a creature spell from that player’s graveyard this turn, and you may spend mana as though it were mana of any color to cast that spell. +K:Equip:3 +Oracle:Equipped creature gets +2/+0.\nWhenever equipped creature deals combat damage to a player, you may cast a creature spell from that player’s graveyard this turn, and you may spend mana as though it were mana of any color to cast that spell.\nEquip {3} diff --git a/forge-gui/res/editions/Zendikar Rising Commander.txt b/forge-gui/res/editions/Zendikar Rising Commander.txt new file mode 100644 index 00000000000..555e14d0cf8 --- /dev/null +++ b/forge-gui/res/editions/Zendikar Rising Commander.txt @@ -0,0 +1,13 @@ +[metadata] +Code=ZNC +Date=2020-09-25 +Name=Zendikar Rising Commander +Type=Other + +[cards] +1 M Anowon, the Ruin Thief +2 M Obuun, Mul Daya Ancestor +3 R Trove Warden +4 R Enigma Thief +5 R Whispersteel Dagger +6 R Geode Rager From 324ac00ae4ac5d9b5bb4ce921cbff55ad01513a6 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Wed, 23 Sep 2020 07:24:12 +0200 Subject: [PATCH 83/96] TargetSelection: fix trigger need to be Mandatory --- forge-gui/src/main/java/forge/player/TargetSelection.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/player/TargetSelection.java b/forge-gui/src/main/java/forge/player/TargetSelection.java index d9230e11b1e..7a143733d35 100644 --- a/forge-gui/src/main/java/forge/player/TargetSelection.java +++ b/forge-gui/src/main/java/forge/player/TargetSelection.java @@ -66,7 +66,8 @@ public class TargetSelection { private boolean bTargetingDone = false; private boolean isMandatory() { - return ability.isMandatory() || getTgt().getMandatory(); + // even if its an optionalTrigger, the targeting is still mandatory + return ability.isTrigger() || getTgt().getMandatory(); } public final boolean chooseTargets(Integer numTargets) { From 8e7e2933fe87d454b67f4f4616f84658162d6ce3 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Wed, 23 Sep 2020 18:15:58 +0800 Subject: [PATCH 84/96] remove unnecessary line wrap --- forge-gui/src/main/java/forge/util/ImageFetcher.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java index e55ed9ac0a2..d255e1ba004 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -118,8 +118,7 @@ public abstract class ImageFetcher { } if (destFile.exists()) { - // TODO: Figure out why this codepath gets reached. Ideally, fetchImage() - // wouldn't + // TODO: Figure out why this codepath gets reached. Ideally, fetchImage() wouldn't // be called if we already have the image. return; } From e9522e4f4fad32f5a7b16c11a9529273f7e3cd7f Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 24 Sep 2020 15:05:15 -0400 Subject: [PATCH 85/96] Update Trophy Case images (dracontes!!) --- forge-gui/res/lists/achievement-images.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/forge-gui/res/lists/achievement-images.txt b/forge-gui/res/lists/achievement-images.txt index 718abf2b224..7d7919e0287 100644 --- a/forge-gui/res/lists/achievement-images.txt +++ b/forge-gui/res/lists/achievement-images.txt @@ -2,9 +2,13 @@ https://downloads.cardforge.org/images/achievements/Ajani%20Goldmane.png https://downloads.cardforge.org/images/achievements/Ajani%20Steadfast.png https://downloads.cardforge.org/images/achievements/Ajani%20Unyielding.png https://downloads.cardforge.org/images/achievements/Ajani%20Vengeant.png +https://downloads.cardforge.org/images/achievements/Ajani%2C%20Adversary%20of%20Tyrants.png https://downloads.cardforge.org/images/achievements/Ajani%2C%20Caller%20of%20the%20Pride.png +https://downloads.cardforge.org/images/achievements/Ajani%2C%20Inspiring%20Leader.png https://downloads.cardforge.org/images/achievements/Ajani%2C%20Mentor%20of%20Heroes.png +https://downloads.cardforge.org/images/achievements/Ajani%2C%20Strength%20of%20the%20Pride.png https://downloads.cardforge.org/images/achievements/Ajani%2C%20Valiant%20Protector.png +https://downloads.cardforge.org/images/achievements/Ajani%2C%20Wise%20Counselor.png https://downloads.cardforge.org/images/achievements/Approach%20of%20the%20Second%20Sun.png https://downloads.cardforge.org/images/achievements/ArcaneMaster.png https://downloads.cardforge.org/images/achievements/Archenemy.png @@ -16,7 +20,9 @@ https://downloads.cardforge.org/images/achievements/Barren%20Glory.png https://downloads.cardforge.org/images/achievements/Battle%20of%20Wits.png https://downloads.cardforge.org/images/achievements/Biovisionary.png https://downloads.cardforge.org/images/achievements/Blackjack.png +https://downloads.cardforge.org/images/achievements/Brawl.png https://downloads.cardforge.org/images/achievements/Chance%20Encounter.png +https://downloads.cardforge.org/images/achievements/Chance%20for%20Glory.png https://downloads.cardforge.org/images/achievements/Chandra%20Ablaze.png https://downloads.cardforge.org/images/achievements/Chandra%20Nalaar.png https://downloads.cardforge.org/images/achievements/Chandra%2C%20Flamecaller.png @@ -43,6 +49,7 @@ https://downloads.cardforge.org/images/achievements/Elspeth%2C%20Knight-Errant.p https://downloads.cardforge.org/images/achievements/Elspeth%2C%20Sun%27s%20Champion.png https://downloads.cardforge.org/images/achievements/Epic%20Struggle.png https://downloads.cardforge.org/images/achievements/Epic.png +https://downloads.cardforge.org/images/achievements/Etrata%2C%20the%20Silencer.png https://downloads.cardforge.org/images/achievements/Felidar%20Sovereign.png https://downloads.cardforge.org/images/achievements/Freyalise%2C%20Llanowar%27s%20Fury.png https://downloads.cardforge.org/images/achievements/GameWinStreak.png @@ -82,17 +89,21 @@ https://downloads.cardforge.org/images/achievements/Liliana%2C%20Death%20Wielder https://downloads.cardforge.org/images/achievements/Liliana%2C%20Death%27s%20Majesty.png https://downloads.cardforge.org/images/achievements/Liliana%2C%20Defiant%20Necromancer.png https://downloads.cardforge.org/images/achievements/Liliana%2C%20The%20Last%20Hope.png +https://downloads.cardforge.org/images/achievements/Lord%20Windgrace.png +https://downloads.cardforge.org/images/achievements/Lukka%2C%20Coppercoat%20Outcast.png https://downloads.cardforge.org/images/achievements/ManaFlooded.png https://downloads.cardforge.org/images/achievements/ManaScrewed.png https://downloads.cardforge.org/images/achievements/MatchWinStreak.png https://downloads.cardforge.org/images/achievements/Mayael%27s%20Aria.png https://downloads.cardforge.org/images/achievements/Maze%27s%20End.png https://downloads.cardforge.org/images/achievements/Mechanized%20Production.png +https://downloads.cardforge.org/images/achievements/MoJhoSto.png https://downloads.cardforge.org/images/achievements/MomirBasic.png https://downloads.cardforge.org/images/achievements/Mortal%20Combat.png https://downloads.cardforge.org/images/achievements/Nahiri%2C%20the%20Harbinger.png https://downloads.cardforge.org/images/achievements/Nahiri%2C%20the%20Lithomancer.png https://downloads.cardforge.org/images/achievements/Narset%20Transcendent.png +https://downloads.cardforge.org/images/achievements/Narset%20of%20the%20Ancient%20Way.png https://downloads.cardforge.org/images/achievements/Near-Death%20Experience.png https://downloads.cardforge.org/images/achievements/NeedForSpeed.png https://downloads.cardforge.org/images/achievements/Nicol%20Bolas%2C%20Planeswalker.png @@ -106,8 +117,11 @@ https://downloads.cardforge.org/images/achievements/Nissa%2C%20Worldwaker.png https://downloads.cardforge.org/images/achievements/NoCreatures.png https://downloads.cardforge.org/images/achievements/NoLands.png https://downloads.cardforge.org/images/achievements/NoSpells.png +https://downloads.cardforge.org/images/achievements/Oathbreaker.png https://downloads.cardforge.org/images/achievements/Ob%20Nixilis%20Reignited.png https://downloads.cardforge.org/images/achievements/Ob%20Nixilis%20of%20the%20Black%20Oath.png +https://downloads.cardforge.org/images/achievements/Oko%2C%20the%20Trickster.png +https://downloads.cardforge.org/images/achievements/Oko%2C%20Thief%20of%20Crowns.png https://downloads.cardforge.org/images/achievements/Overkill.png https://downloads.cardforge.org/images/achievements/Phage%20the%20Untouchable.png https://downloads.cardforge.org/images/achievements/Planechase.png From 625bbb37db0dfa85953b7c7b5c6cc98d27163a4a Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 25 Sep 2020 09:57:46 -0400 Subject: [PATCH 86/96] grenzo_havoc_raiser.txt fix Goad mode --- forge-gui/res/cardsfolder/g/grenzo_havoc_raiser.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/g/grenzo_havoc_raiser.txt b/forge-gui/res/cardsfolder/g/grenzo_havoc_raiser.txt index be9ea4b9703..ec283b930b4 100644 --- a/forge-gui/res/cardsfolder/g/grenzo_havoc_raiser.txt +++ b/forge-gui/res/cardsfolder/g/grenzo_havoc_raiser.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Goblin Rogue PT:2/2 T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigCharm | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature you control deals combat damage to a player, ABILITY SVar:TrigCharm:DB$ Charm | Choices$ DBGoad,DBExile -SVar:DBGoad:DB$ Goad | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player controls. | SpellDescription$ Goad target creature that player controls. +SVar:DBGoad:DB$ Goad | ValidTgts$ Creature | TargetsWithDefinedController$ TriggeredTarget | TgtPrompt$ Select target creature damaged player controls | SpellDescription$ Goad target creature that player controls. SVar:DBExile:DB$ Dig | Defined$ TriggeredDefendingPlayer | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top card of that player's library. Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it. SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | Triggers$ TriggerCastDoM | SVars$ TrigRemoveSelf | RememberObjects$ Remembered | SubAbility$ DBCleanup SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | Description$ Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it. From b62b870a09d898f2bb1b5754022bf6de8b548f49 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 25 Sep 2020 09:59:14 -0400 Subject: [PATCH 87/96] punctuation --- .../main/java/forge/game/ability/effects/ChangeZoneEffect.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index a0658245c3f..2238fabfdca 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -322,7 +322,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (ZoneType.Graveyard.equals(origin)) { sb.append(fromGraveyard); } - sb.append(" to").append(pronoun).append("owners hand."); + sb.append(" to").append(pronoun).append("owner's hand."); } if (destination.equals(ZoneType.Library)) { From 5e05b63febe69afb7fc445bd50c6d2cbe52bccbf Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 25 Sep 2020 11:09:36 -0400 Subject: [PATCH 88/96] fix moraug_fury_of_akoum.txt so it triggers on your turn only --- forge-gui/res/cardsfolder/upcoming/ZNR/moraug_fury_of_akoum.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/moraug_fury_of_akoum.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/moraug_fury_of_akoum.txt index b884bbf4a18..8b2834eaadc 100644 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/moraug_fury_of_akoum.txt +++ b/forge-gui/res/cardsfolder/upcoming/ZNR/moraug_fury_of_akoum.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Minotaur Warrior PT:6/6 S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ AffectedX | Description$ Each creature you control gets +1/+0 for each time it has attacked this turn. SVar:AffectedX:Count$CardNumAttacksThisTurn -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Condition$ PlayerTurn | Phase$ Main1,Main2 | Execute$ TrigAddPhase | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, if it's your main phase, there's an additional combat phase after this phase. At the beginning of that combat, untap all creatures you control. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | PlayerTurn$ True | Phase$ Main1,Main2 | Execute$ TrigAddPhase | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, if it's your main phase, there's an additional combat phase after this phase. At the beginning of that combat, untap all creatures you control. SVar:TrigAddPhase:DB$ AddPhase | ExtraPhase$ BeginCombat | AfterPhase$ Main1 | FollowedBy$ BeginCombat | ConditionPhases$ Main1 | SubAbility$ DBAddPhase SVar:DBAddPhase:DB$ AddPhase | ExtraPhase$ BeginCombat | AfterPhase$ Main2 | FollowedBy$ End of Turn | ConditionPhases$ Main2 | SubAbility$ DelTrigUntap SVar:DelTrigUntap:DB$ DelayedTrigger | Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigUntapAll | TriggerDescription$ At the beginning of that combat, untap all creatures you control. From 74b8efb828884566b6b9a6bd56e776c04b99640c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 25 Sep 2020 12:37:54 -0400 Subject: [PATCH 89/96] ukkima_stalking_shadow.txt better X --- forge-gui/res/cardsfolder/u/ukkima_stalking_shadow.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/u/ukkima_stalking_shadow.txt b/forge-gui/res/cardsfolder/u/ukkima_stalking_shadow.txt index 047eacbe316..a23b5a1bc3f 100755 --- a/forge-gui/res/cardsfolder/u/ukkima_stalking_shadow.txt +++ b/forge-gui/res/cardsfolder/u/ukkima_stalking_shadow.txt @@ -7,6 +7,6 @@ K:Unblockable T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, it deals X damage to target player and you gain X life, where X is its power. SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Player | TgtPrompt$ Select target player | NumDmg$ X | References$ X | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X -SVar:X:Count$CardPower +SVar:X:TriggeredCard$CardPower DeckHas:Ability$LifeGain Oracle:Partner with Cazur, Ruthless Stalker (When this creature enters the battlefield, target player may put Cazur into their hand from their library, then shuffle.)\nUkkima, Stalking Shadow can't be blocked.\nWhen Ukkima leaves the battlefield, it deals X damage to target player and you gain X life, where X is its power. From 530ade0c72bc594c66143cdb36f38c496f4c736f Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Fri, 25 Sep 2020 21:41:25 +0300 Subject: [PATCH 90/96] - ZNR achievements. --- forge-gui/res/lists/altwin-achievements.txt | 1 + forge-gui/res/lists/planeswalker-achievements.txt | 3 +++ 2 files changed, 4 insertions(+) diff --git a/forge-gui/res/lists/altwin-achievements.txt b/forge-gui/res/lists/altwin-achievements.txt index 7a18e57e5bc..a1cc9fae8bd 100644 --- a/forge-gui/res/lists/altwin-achievements.txt +++ b/forge-gui/res/lists/altwin-achievements.txt @@ -1,3 +1,4 @@ +Angel of Destiny|Outlive Long and Prosper|Life eternal thanks to one weird trick! Approach of the Second Sun|The God-Pharaoh's Return|I'm back! Did you miss me? Azor's Elocutors|The Filibuster|Talk might be cheap, but it can buy you victory! Barren Glory|The Clean Slate|When you have nothing, you can lose nothing... so you can win everything! diff --git a/forge-gui/res/lists/planeswalker-achievements.txt b/forge-gui/res/lists/planeswalker-achievements.txt index 2044532eeb5..3510930ed1b 100644 --- a/forge-gui/res/lists/planeswalker-achievements.txt +++ b/forge-gui/res/lists/planeswalker-achievements.txt @@ -74,6 +74,7 @@ Jace, Architect of Thought|Jace's Incantation|I like that one. I'll steal it! Jace, Cunning Castaway|Jace's Mirror Image|Who is real and who is fake? Jace, Ingenious Mind-Mage|Jace's Will|Let me change your minds... Jace, Memory Adept|Jace's Revelation|So many things to learn! +Jace, Mirror Mage|Jace the Bob|Really not much of an achievement at all, but what can you do? Jace, Telepath Unbound|Jace's Erasure|First empty your mind and then... nope, that's it. Jace, the Living Guildpact|Jace's Timetwister|Symmetry? What symmetry? Jace, the Mind Sculptor|Jace's Lobotomy|What do you mean, "overpowered"? @@ -100,6 +101,7 @@ Liliana, Untouched by Death|Liliana's Graveyard Party|What? I'm not touching you Liliana, Waker of the Dead|Liliana's Rotten Reserves|They awaken, feeling well-rested. Lord Windgrace|Windgrace's Hunting Party|Let me show you a true cat-astrophe. Lukka, Coppercoat Outcast|Lukka's Ultimatum|Get them. +Nahiri, Heir of the Ancients|Swiss-Army Nahiri|It pays to be well-equipped. Nahiri, the Harbinger|Nahiri's Mystery Guest|This should be your cue to run. Nahiri, the Lithomancer|Nahiri's Gift|I pulled it out! Now I'm a king! Narset of the Ancient Way|Narset's Burning Knowledge|Prowess both magical and martial. @@ -109,6 +111,7 @@ Nicol Bolas, God-Pharaoh|Bolas's Cleansing|Let's just tear this down and start a Nicol Bolas, Planeswalker|Bolas's Ultimatum|Whatever you do, don't call him "Nicol"! Nicol Bolas, the Arisen|Bolas's Mind Wipe|Anything Jace can do, I can do better. Nicol Bolas, the Deceiver|Bolas's Cunning Hit|I know exactly how to hurt you. +Nissa of Shadowed Boughs|Nissa's Reanimation|Every land hides some secrets deep down. Nissa Revane|Nissa's Summoning|The whole village is here! Nissa, Genesis Mage|Nissa's Genesis Wave|Let's see who shows up. Nissa, Nature's Artisan|Nissa's Stampede|Big enough for you? From 92c6440a3690dcf671b565d699c62d1a0e431f80 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 25 Sep 2020 15:05:45 -0400 Subject: [PATCH 91/96] migrate ZNR + ZNC --- .../res/cardsfolder/{upcoming/ZNR => a}/acquisitions_expert.txt | 0 .../res/cardsfolder/{upcoming/ZNR => a}/adventure_awaits.txt | 0 .../ZNR => a}/agadeems_awakening_agadeem_the_undercrypt.txt | 0 .../cardsfolder/{upcoming/ZNR => a}/akiri_fearless_voyager.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => a}/akoum_hellhound.txt | 0 .../cardsfolder/{upcoming/ZNR => a}/akoum_warrior_akoum_teeth.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => a}/allied_assault.txt | 0 .../res/cardsfolder/{upcoming/ZNR => a}/ancient_greenwarden.txt | 0 .../res/cardsfolder/{upcoming/ZNR => a}/angel_of_destiny.txt | 0 .../res/cardsfolder/{upcoming/ZNR => a}/angelheart_protector.txt | 0 .../res/cardsfolder/{upcoming/ZNC => a}/anowon_the_ruin_thief.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => a}/anticognition.txt | 0 .../res/cardsfolder/{upcoming/ZNR => a}/archon_of_emeria.txt | 0 .../res/cardsfolder/{upcoming/ZNR => a}/archpriest_of_iona.txt | 0 .../res/cardsfolder/{upcoming/ZNR => a}/ardent_electromancer.txt | 0 .../cardsfolder/{upcoming/ZNR => a}/ashaya_soul_of_the_wild.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => a}/attended_healer.txt | 0 .../{upcoming/ZNR => b}/bala_ged_recovery_bala_ged_sanctuary.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => b}/base_camp.txt | 0 .../cardsfolder/{upcoming/ZNR => b}/beyeen_veil_beyeen_coast.txt | 0 .../{upcoming/ZNR => b}/blackbloom_rogue_blackbloom_bog.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => b}/blood_beckoning.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => b}/blood_price.txt | 0 .../res/cardsfolder/{upcoming/ZNR => b}/bloodchiefs_thirst.txt | 0 .../ZNR => b}/branchloft_pathway_boulderloft_pathway.txt | 0 .../{upcoming/ZNR => b}/brightclimb_pathway_grimclimb_pathway.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => b}/broken_wings.txt | 0 .../res/cardsfolder/{upcoming/ZNR => b}/brushfire_elemental.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => b}/bubble_snare.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => c}/canopy_baloth.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => c}/canyon_jerboa.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => c}/cascade_seer.txt | 0 .../cardsfolder/{upcoming/ZNR => c}/charix_the_raging_isle.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => c}/chilling_trap.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => c}/cinderclasm.txt | 0 .../res/cardsfolder/{upcoming/ZNR => c}/cleansing_wildfire.txt | 0 .../{upcoming/ZNR => c}/clearwater_pathway_murkwater_pathway.txt | 0 .../cardsfolder/{upcoming/ZNR => c}/cleric_of_chill_depths.txt | 0 .../res/cardsfolder/{upcoming/ZNR => c}/cleric_of_lifes_bond.txt | 0 .../res/cardsfolder/{upcoming/ZNR => c}/cliffhaven_kitesail.txt | 0 .../res/cardsfolder/{upcoming/ZNR => c}/cliffhaven_sell_sword.txt | 0 .../res/cardsfolder/{upcoming/ZNR => c}/concerted_defense.txt | 0 .../res/cardsfolder/{upcoming/ZNR => c}/confounding_conundrum.txt | 0 .../res/cardsfolder/{upcoming/ZNR => c}/coralhelm_chronicler.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => c}/coveted_prize.txt | 0 .../{upcoming/ZNR => c}/cragcrown_pathway_timbercrown_pathway.txt | 0 .../res/cardsfolder/{upcoming/ZNR => c}/cragplate_baloth.txt | 0 .../res/cardsfolder/{upcoming/ZNR => c}/crawling_barrens.txt | 0 .../res/cardsfolder/{upcoming/ZNR => c}/cunning_geysermage.txt | 0 .../res/cardsfolder/{upcoming/ZNR => d}/dauntless_survivor.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => d}/dauntless_unity.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => d}/deadly_alliance.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => d}/deliberate.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => d}/demons_disciple.txt | 0 .../cardsfolder/{upcoming/ZNR => d}/drana_the_last_bloodchief.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => d}/dranas_silencer.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => d}/dreadwurm.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => e}/emeria_captain.txt | 0 .../ZNR => e}/emerias_call_emeria_shattered_skyclave.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNC => e}/enigma_thief.txt | 0 .../res/cardsfolder/{upcoming/ZNR => e}/expedition_champion.txt | 0 .../res/cardsfolder/{upcoming/ZNR => e}/expedition_diviner.txt | 0 .../res/cardsfolder/{upcoming/ZNR => e}/expedition_healer.txt | 0 .../res/cardsfolder/{upcoming/ZNR => e}/expedition_skulker.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => f}/farsight_adept.txt | 0 .../res/cardsfolder/{upcoming/ZNR => f}/fearless_fledgling.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => f}/feed_the_swarm.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => f}/felidar_retreat.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => f}/field_research.txt | 0 .../res/cardsfolder/{upcoming/ZNR => f}/fireblade_charger.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => f}/fissure_wizard.txt | 0 .../res/cardsfolder/{upcoming/ZNR => f}/forsaken_monument.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNC => g}/geode_rager.txt | 0 .../res/cardsfolder/{upcoming/ZNR => g}/ghastly_gloomhunter.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => g}/glacial_grasp.txt | 0 .../{upcoming/ZNR => g}/glasspool_mimic_glasspool_shore.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => g}/gnarlid_colony.txt | 0 .../res/cardsfolder/{upcoming/ZNR => g}/goma_fada_vanguard.txt | 0 .../cardsfolder/{upcoming/ZNR => g}/grakmaw_skyclave_ravager.txt | 0 .../res/cardsfolder/{upcoming/ZNR => g}/grotag_bug_catcher.txt | 0 .../res/cardsfolder/{upcoming/ZNR => g}/grotag_night_runner.txt | 0 .../res/cardsfolder/{upcoming/ZNR => g}/guul_draz_mucklord.txt | 0 .../res/cardsfolder/{upcoming/ZNR => h}/hagra_constrictor.txt | 0 .../{upcoming/ZNR => h}/hagra_mauling_hagra_broodpit.txt | 0 .../res/cardsfolder/{upcoming/ZNR => h}/highborn_vampire.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => i}/inordinate_rage.txt | 0 .../res/cardsfolder/{upcoming/ZNR => j}/jace_mirror_mage.txt | 0 .../res/cardsfolder/{upcoming/ZNR => j}/joraga_visionary.txt | 0 .../res/cardsfolder/{upcoming/ZNR => j}/journey_to_oblivion.txt | 0 .../{upcoming/ZNR => j}/jwari_disruption_jwari_ruins.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kabira_outrider.txt | 0 .../{upcoming/ZNR => k}/kabira_takedown_kabira_plateau.txt | 0 .../res/cardsfolder/{upcoming/ZNR => k}/kargan_intimidator.txt | 0 .../res/cardsfolder/{upcoming/ZNR => k}/kargan_warleader.txt | 0 .../res/cardsfolder/{upcoming/ZNR => k}/kaza_roil_chaser.txt | 0 .../{upcoming/ZNR => k}/kazandu_mammoth_kazandu_valley.txt | 0 .../res/cardsfolder/{upcoming/ZNR => k}/kazandu_nectarpot.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kazandu_stomper.txt | 0 .../{upcoming/ZNR => k}/kazuuls_fury_kazuuls_cliffs.txt | 0 .../{upcoming/ZNR => k}/khalni_ambush_khalni_territory.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kitesail_cleric.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kor_blademaster.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kor_celebrant.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => l}/legion_angel.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => l}/leyline_tyrant.txt | 0 .../{upcoming/ZNR => l}/linvala_shield_of_sea_gate.txt | 0 .../res/cardsfolder/{upcoming/ZNR => l}/lithoform_blight.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => l}/living_tempest.txt | 0 .../res/cardsfolder/{upcoming/ZNR => l}/lullmages_domination.txt | 0 .../res/cardsfolder/{upcoming/ZNR => l}/lullmages_familiar.txt | 0 .../res/cardsfolder/{upcoming/ZNR => l}/luminarch_aspirant.txt | 0 .../res/cardsfolder/{upcoming/ZNR => m}/maddening_cacophony.txt | 0 .../res/cardsfolder/{upcoming/ZNR => m}/magmatic_channeler.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => m}/makindi_ox.txt | 0 .../{upcoming/ZNR => m}/makindi_stampede_makindi_mesas.txt | 0 .../res/cardsfolder/{upcoming/ZNR => m}/malakir_blood_priest.txt | 0 .../{upcoming/ZNR => m}/malakir_rebirth_malakir_mire.txt | 0 .../cardsfolder/{upcoming/ZNR => m}/marauding_blight_priest.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => m}/master_of_winds.txt | 0 .../res/cardsfolder/{upcoming/ZNR => m}/maul_of_the_skyclaves.txt | 0 .../res/cardsfolder/{upcoming/ZNR => m}/merfolk_falconer.txt | 0 .../res/cardsfolder/{upcoming/ZNR => m}/merfolk_windrobber.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => m}/mesa_lynx.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => m}/might_of_murasa.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => m}/mind_carver.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => m}/mind_drain.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => m}/molten_blast.txt | 0 .../res/cardsfolder/{upcoming/ZNR => m}/moraug_fury_of_akoum.txt | 0 .../res/cardsfolder/{upcoming/ZNR => m}/moss_pit_skeleton.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => m}/murasa_brute.txt | 0 .../res/cardsfolder/{upcoming/ZNR => m}/murasa_rootgrazer.txt | 0 .../res/cardsfolder/{upcoming/ZNR => m}/murasa_sproutling.txt | 0 .../res/cardsfolder/{upcoming/ZNR => m}/myriad_construct.txt | 0 .../{upcoming/ZNR => n}/nahiri_heir_of_the_ancients.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => n}/nahiris_binding.txt | 0 .../res/cardsfolder/{upcoming/ZNR => n}/nahiris_lithoforming.txt | 0 .../ZNR => n}/needleverge_pathway_pillarverge_pathway.txt | 0 .../res/cardsfolder/{upcoming/ZNR => n}/nighthawk_scavenger.txt | 0 .../res/cardsfolder/{upcoming/ZNR => n}/nimana_skitter_sneak.txt | 0 .../res/cardsfolder/{upcoming/ZNR => n}/nimana_skydancer.txt | 0 .../res/cardsfolder/{upcoming/ZNR => n}/nimble_trapfinder.txt | 0 .../cardsfolder/{upcoming/ZNR => n}/nissa_of_shadowed_boughs.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => n}/nissas_zendikon.txt | 0 .../cardsfolder/{upcoming/ZNR => n}/nullpriest_of_oblivion.txt | 0 .../res/cardsfolder/{upcoming/ZNR => o}/oblivions_hunger.txt | 0 .../cardsfolder/{upcoming/ZNC => o}/obuun_mul_daya_ancestor.txt | 0 .../cardsfolder/{upcoming/ZNR => o}/omnath_locus_of_creation.txt | 0 .../{upcoming/ZNR => o}/ondu_inversion_ondu_skyruins.txt | 0 .../cardsfolder/{upcoming/ZNR => o}/orah_skyclave_hierophant.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => o}/oran_rief_ooze.txt | 0 .../res/cardsfolder/{upcoming/ZNR => p}/paired_tactician.txt | 0 .../{upcoming/ZNR => p}/pelakka_predation_pelakka_caverns.txt | 0 .../cardsfolder/{upcoming/ZNR => p}/phylath_world_sculptor.txt | 0 .../res/cardsfolder/{upcoming/ZNR => p}/practiced_tactics.txt | 0 .../res/cardsfolder/{upcoming/ZNR => p}/prowling_felidar.txt | 0 .../res/cardsfolder/{upcoming/ZNR => p}/pyroclastic_hellion.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => r}/ravagers_mace.txt | 0 .../res/cardsfolder/{upcoming/ZNR => r}/reclaim_the_wastes.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => r}/relic_amulet.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => r}/relic_axe.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => r}/relic_golem.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => r}/relic_robber.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => r}/relic_vial.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => r}/resolute_strike.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => r}/risen_riptide.txt | 0 .../{upcoming/ZNR => r}/riverglide_pathway_lavaglide_pathway.txt | 0 .../res/cardsfolder/{upcoming/ZNR => r}/rockslide_sorcerer.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => r}/roil_eruption.txt | 0 .../res/cardsfolder/{upcoming/ZNR => r}/roiling_regrowth.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => r}/roiling_vortex.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => r}/roost_of_drakes.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => r}/ruin_crab.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/scale_the_heights.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => s}/scavenged_blade.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/scion_of_the_swarm.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => s}/scorch_rider.txt | 0 .../cardsfolder/{upcoming/ZNR => s}/scourge_of_the_skyclaves.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => s}/scute_swarm.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/sea_gate_banneret.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/sea_gate_colossus.txt | 0 .../{upcoming/ZNR => s}/sea_gate_restoration_sea_gate_reborn.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/sea_gate_stormcaller.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/seafloor_stalker.txt | 0 .../{upcoming/ZNR => s}/sejiri_shelter_sejiri_glacier.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => s}/shadow_stinger.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => s}/shadows_verdict.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/shatterskull_charger.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/shatterskull_minotaur.txt | 0 .../shatterskull_smashing_shatterskull_the_hammer_pass.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => s}/shell_shield.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/shepherd_of_heroes.txt | 0 .../{upcoming/ZNR => s}/silundi_vision_silundi_isle.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/sizzling_barrage.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/skyclave_apparition.txt | 0 .../{upcoming/ZNR => s}/skyclave_cleric_skyclave_basilica.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/skyclave_geopede.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/skyclave_pick_axe.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/skyclave_plunder.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => s}/skyclave_relic.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/skyclave_sentinel.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => s}/skyclave_shade.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/skyclave_shadowcat.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => s}/skyclave_squid.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => s}/sneaking_guide.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/soaring_thought_thief.txt | 0 .../{upcoming/ZNR => s}/song_mad_treachery_song_mad_ruins.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => s}/soul_shatter.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => s}/spare_supplies.txt | 0 .../{upcoming/ZNR => s}/spikefield_hazard_spikefield_cave.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => s}/spitfire_lagac.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/spoils_of_adventure.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/springmantle_cleric.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => s}/squad_commander.txt | 0 .../res/cardsfolder/{upcoming/ZNR => s}/stonework_packbeast.txt | 0 .../cardsfolder/{upcoming/ZNR => s}/strength_of_solidarity.txt | 0 .../cardsfolder/{upcoming/ZNR => s}/sure_footed_infiltrator.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => s}/swarm_shambler.txt | 0 .../cardsfolder/{upcoming/ZNR => s}/synchronized_spellcraft.txt | 0 .../res/cardsfolder/{upcoming/ZNR => t}/taborax_hopes_demise.txt | 0 .../res/cardsfolder/{upcoming/ZNR => t}/tajuru_blightblade.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => t}/tajuru_paragon.txt | 0 .../res/cardsfolder/{upcoming/ZNR => t}/tajuru_snarecaster.txt | 0 .../{upcoming/ZNR => t}/tangled_florahedron_tangled_vale.txt | 0 .../res/cardsfolder/{upcoming/ZNR => t}/taunting_arbormage.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => t}/tazeem_raptor.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => t}/tazeem_roilmage.txt | 0 .../res/cardsfolder/{upcoming/ZNR => t}/tazri_beacon_of_unity.txt | 0 .../res/cardsfolder/{upcoming/ZNR => t}/teeterpeak_ambusher.txt | 0 .../res/cardsfolder/{upcoming/ZNR => t}/territorial_scythecat.txt | 0 .../res/cardsfolder/{upcoming/ZNR => t}/thieving_skydiver.txt | 0 .../res/cardsfolder/{upcoming/ZNR => t}/throne_of_makindi.txt | 0 .../res/cardsfolder/{upcoming/ZNR => t}/thundering_rebuke.txt | 0 .../res/cardsfolder/{upcoming/ZNR => t}/thundering_sparkmage.txt | 0 .../res/cardsfolder/{upcoming/ZNR => t}/thwart_the_grave.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNC => t}/trove_warden.txt | 0 .../res/cardsfolder/{upcoming/ZNR => t}/tuktuk_rubblefort.txt | 0 .../res/cardsfolder/{upcoming/ZNR => t}/turntimber_ascetic.txt | 0 .../ZNR => t}/turntimber_symbiosis_turntimber_serpentine_wood.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => u}/umara_mystic.txt | 0 .../{upcoming/ZNR => u}/umara_wizard_umara_skyfalls.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => u}/utility_knife.txt | 0 .../{upcoming/ZNR => v}/valakut_awakening_valakut_stoneforge.txt | 0 .../res/cardsfolder/{upcoming/ZNR => v}/valakut_exploration.txt | 0 .../ZNR => v}/vastwood_fortification_vastwood_thicket.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => v}/vastwood_surge.txt | 0 .../res/cardsfolder/{upcoming/ZNR => v}/veteran_adventurer.txt | 0 forge-gui/res/cardsfolder/{upcoming/ZNR => v}/vine_gecko.txt | 0 .../res/cardsfolder/{upcoming/ZNR => w}/wayward_guide_beast.txt | 0 .../res/cardsfolder/{upcoming/ZNC => w}/whispersteel_dagger.txt | 0 .../res/cardsfolder/{upcoming/ZNR => w}/windrider_wizard.txt | 0 .../{upcoming/ZNR => z}/zagras_thief_of_heartbeats.txt | 0 .../cardsfolder/{upcoming/ZNR => z}/zareth_san_the_trickster.txt | 0 .../{upcoming/ZNR => z}/zof_consumption_zof_bloodbog.txt | 0 .../res/cardsfolder/{upcoming/ZNR => z}/zulaport_duelist.txt | 0 254 files changed, 0 insertions(+), 0 deletions(-) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/acquisitions_expert.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/adventure_awaits.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/agadeems_awakening_agadeem_the_undercrypt.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/akiri_fearless_voyager.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/akoum_hellhound.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/akoum_warrior_akoum_teeth.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/allied_assault.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/ancient_greenwarden.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/angel_of_destiny.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/angelheart_protector.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNC => a}/anowon_the_ruin_thief.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/anticognition.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/archon_of_emeria.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/archpriest_of_iona.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/ardent_electromancer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/ashaya_soul_of_the_wild.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => a}/attended_healer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => b}/bala_ged_recovery_bala_ged_sanctuary.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => b}/base_camp.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => b}/beyeen_veil_beyeen_coast.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => b}/blackbloom_rogue_blackbloom_bog.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => b}/blood_beckoning.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => b}/blood_price.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => b}/bloodchiefs_thirst.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => b}/branchloft_pathway_boulderloft_pathway.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => b}/brightclimb_pathway_grimclimb_pathway.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => b}/broken_wings.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => b}/brushfire_elemental.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => b}/bubble_snare.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/canopy_baloth.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/canyon_jerboa.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/cascade_seer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/charix_the_raging_isle.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/chilling_trap.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/cinderclasm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/cleansing_wildfire.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/clearwater_pathway_murkwater_pathway.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/cleric_of_chill_depths.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/cleric_of_lifes_bond.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/cliffhaven_kitesail.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/cliffhaven_sell_sword.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/concerted_defense.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/confounding_conundrum.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/coralhelm_chronicler.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/coveted_prize.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/cragcrown_pathway_timbercrown_pathway.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/cragplate_baloth.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/crawling_barrens.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => c}/cunning_geysermage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => d}/dauntless_survivor.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => d}/dauntless_unity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => d}/deadly_alliance.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => d}/deliberate.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => d}/demons_disciple.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => d}/drana_the_last_bloodchief.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => d}/dranas_silencer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => d}/dreadwurm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => e}/emeria_captain.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => e}/emerias_call_emeria_shattered_skyclave.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNC => e}/enigma_thief.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => e}/expedition_champion.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => e}/expedition_diviner.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => e}/expedition_healer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => e}/expedition_skulker.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => f}/farsight_adept.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => f}/fearless_fledgling.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => f}/feed_the_swarm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => f}/felidar_retreat.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => f}/field_research.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => f}/fireblade_charger.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => f}/fissure_wizard.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => f}/forsaken_monument.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNC => g}/geode_rager.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => g}/ghastly_gloomhunter.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => g}/glacial_grasp.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => g}/glasspool_mimic_glasspool_shore.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => g}/gnarlid_colony.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => g}/goma_fada_vanguard.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => g}/grakmaw_skyclave_ravager.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => g}/grotag_bug_catcher.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => g}/grotag_night_runner.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => g}/guul_draz_mucklord.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => h}/hagra_constrictor.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => h}/hagra_mauling_hagra_broodpit.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => h}/highborn_vampire.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => i}/inordinate_rage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => j}/jace_mirror_mage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => j}/joraga_visionary.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => j}/journey_to_oblivion.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => j}/jwari_disruption_jwari_ruins.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kabira_outrider.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kabira_takedown_kabira_plateau.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kargan_intimidator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kargan_warleader.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kaza_roil_chaser.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kazandu_mammoth_kazandu_valley.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kazandu_nectarpot.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kazandu_stomper.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kazuuls_fury_kazuuls_cliffs.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => k}/khalni_ambush_khalni_territory.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kitesail_cleric.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kor_blademaster.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => k}/kor_celebrant.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => l}/legion_angel.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => l}/leyline_tyrant.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => l}/linvala_shield_of_sea_gate.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => l}/lithoform_blight.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => l}/living_tempest.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => l}/lullmages_domination.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => l}/lullmages_familiar.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => l}/luminarch_aspirant.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/maddening_cacophony.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/magmatic_channeler.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/makindi_ox.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/makindi_stampede_makindi_mesas.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/malakir_blood_priest.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/malakir_rebirth_malakir_mire.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/marauding_blight_priest.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/master_of_winds.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/maul_of_the_skyclaves.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/merfolk_falconer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/merfolk_windrobber.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/mesa_lynx.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/might_of_murasa.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/mind_carver.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/mind_drain.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/molten_blast.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/moraug_fury_of_akoum.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/moss_pit_skeleton.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/murasa_brute.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/murasa_rootgrazer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/murasa_sproutling.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => m}/myriad_construct.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => n}/nahiri_heir_of_the_ancients.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => n}/nahiris_binding.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => n}/nahiris_lithoforming.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => n}/needleverge_pathway_pillarverge_pathway.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => n}/nighthawk_scavenger.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => n}/nimana_skitter_sneak.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => n}/nimana_skydancer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => n}/nimble_trapfinder.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => n}/nissa_of_shadowed_boughs.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => n}/nissas_zendikon.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => n}/nullpriest_of_oblivion.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => o}/oblivions_hunger.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNC => o}/obuun_mul_daya_ancestor.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => o}/omnath_locus_of_creation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => o}/ondu_inversion_ondu_skyruins.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => o}/orah_skyclave_hierophant.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => o}/oran_rief_ooze.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => p}/paired_tactician.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => p}/pelakka_predation_pelakka_caverns.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => p}/phylath_world_sculptor.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => p}/practiced_tactics.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => p}/prowling_felidar.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => p}/pyroclastic_hellion.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/ravagers_mace.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/reclaim_the_wastes.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/relic_amulet.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/relic_axe.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/relic_golem.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/relic_robber.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/relic_vial.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/resolute_strike.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/risen_riptide.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/riverglide_pathway_lavaglide_pathway.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/rockslide_sorcerer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/roil_eruption.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/roiling_regrowth.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/roiling_vortex.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/roost_of_drakes.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => r}/ruin_crab.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/scale_the_heights.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/scavenged_blade.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/scion_of_the_swarm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/scorch_rider.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/scourge_of_the_skyclaves.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/scute_swarm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/sea_gate_banneret.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/sea_gate_colossus.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/sea_gate_restoration_sea_gate_reborn.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/sea_gate_stormcaller.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/seafloor_stalker.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/sejiri_shelter_sejiri_glacier.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/shadow_stinger.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/shadows_verdict.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/shatterskull_charger.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/shatterskull_minotaur.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/shatterskull_smashing_shatterskull_the_hammer_pass.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/shell_shield.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/shepherd_of_heroes.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/silundi_vision_silundi_isle.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/sizzling_barrage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/skyclave_apparition.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/skyclave_cleric_skyclave_basilica.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/skyclave_geopede.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/skyclave_pick_axe.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/skyclave_plunder.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/skyclave_relic.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/skyclave_sentinel.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/skyclave_shade.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/skyclave_shadowcat.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/skyclave_squid.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/sneaking_guide.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/soaring_thought_thief.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/song_mad_treachery_song_mad_ruins.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/soul_shatter.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/spare_supplies.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/spikefield_hazard_spikefield_cave.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/spitfire_lagac.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/spoils_of_adventure.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/springmantle_cleric.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/squad_commander.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/stonework_packbeast.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/strength_of_solidarity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/sure_footed_infiltrator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/swarm_shambler.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => s}/synchronized_spellcraft.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/taborax_hopes_demise.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/tajuru_blightblade.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/tajuru_paragon.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/tajuru_snarecaster.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/tangled_florahedron_tangled_vale.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/taunting_arbormage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/tazeem_raptor.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/tazeem_roilmage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/tazri_beacon_of_unity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/teeterpeak_ambusher.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/territorial_scythecat.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/thieving_skydiver.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/throne_of_makindi.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/thundering_rebuke.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/thundering_sparkmage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/thwart_the_grave.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNC => t}/trove_warden.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/tuktuk_rubblefort.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/turntimber_ascetic.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => t}/turntimber_symbiosis_turntimber_serpentine_wood.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => u}/umara_mystic.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => u}/umara_wizard_umara_skyfalls.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => u}/utility_knife.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => v}/valakut_awakening_valakut_stoneforge.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => v}/valakut_exploration.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => v}/vastwood_fortification_vastwood_thicket.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => v}/vastwood_surge.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => v}/veteran_adventurer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => v}/vine_gecko.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => w}/wayward_guide_beast.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNC => w}/whispersteel_dagger.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => w}/windrider_wizard.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => z}/zagras_thief_of_heartbeats.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => z}/zareth_san_the_trickster.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => z}/zof_consumption_zof_bloodbog.txt (100%) rename forge-gui/res/cardsfolder/{upcoming/ZNR => z}/zulaport_duelist.txt (100%) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/acquisitions_expert.txt b/forge-gui/res/cardsfolder/a/acquisitions_expert.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/acquisitions_expert.txt rename to forge-gui/res/cardsfolder/a/acquisitions_expert.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/adventure_awaits.txt b/forge-gui/res/cardsfolder/a/adventure_awaits.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/adventure_awaits.txt rename to forge-gui/res/cardsfolder/a/adventure_awaits.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/agadeems_awakening_agadeem_the_undercrypt.txt b/forge-gui/res/cardsfolder/a/agadeems_awakening_agadeem_the_undercrypt.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/agadeems_awakening_agadeem_the_undercrypt.txt rename to forge-gui/res/cardsfolder/a/agadeems_awakening_agadeem_the_undercrypt.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/akiri_fearless_voyager.txt b/forge-gui/res/cardsfolder/a/akiri_fearless_voyager.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/akiri_fearless_voyager.txt rename to forge-gui/res/cardsfolder/a/akiri_fearless_voyager.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/akoum_hellhound.txt b/forge-gui/res/cardsfolder/a/akoum_hellhound.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/akoum_hellhound.txt rename to forge-gui/res/cardsfolder/a/akoum_hellhound.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/akoum_warrior_akoum_teeth.txt b/forge-gui/res/cardsfolder/a/akoum_warrior_akoum_teeth.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/akoum_warrior_akoum_teeth.txt rename to forge-gui/res/cardsfolder/a/akoum_warrior_akoum_teeth.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/allied_assault.txt b/forge-gui/res/cardsfolder/a/allied_assault.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/allied_assault.txt rename to forge-gui/res/cardsfolder/a/allied_assault.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/ancient_greenwarden.txt b/forge-gui/res/cardsfolder/a/ancient_greenwarden.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/ancient_greenwarden.txt rename to forge-gui/res/cardsfolder/a/ancient_greenwarden.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/angel_of_destiny.txt b/forge-gui/res/cardsfolder/a/angel_of_destiny.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/angel_of_destiny.txt rename to forge-gui/res/cardsfolder/a/angel_of_destiny.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/angelheart_protector.txt b/forge-gui/res/cardsfolder/a/angelheart_protector.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/angelheart_protector.txt rename to forge-gui/res/cardsfolder/a/angelheart_protector.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNC/anowon_the_ruin_thief.txt b/forge-gui/res/cardsfolder/a/anowon_the_ruin_thief.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNC/anowon_the_ruin_thief.txt rename to forge-gui/res/cardsfolder/a/anowon_the_ruin_thief.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/anticognition.txt b/forge-gui/res/cardsfolder/a/anticognition.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/anticognition.txt rename to forge-gui/res/cardsfolder/a/anticognition.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/archon_of_emeria.txt b/forge-gui/res/cardsfolder/a/archon_of_emeria.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/archon_of_emeria.txt rename to forge-gui/res/cardsfolder/a/archon_of_emeria.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/archpriest_of_iona.txt b/forge-gui/res/cardsfolder/a/archpriest_of_iona.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/archpriest_of_iona.txt rename to forge-gui/res/cardsfolder/a/archpriest_of_iona.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/ardent_electromancer.txt b/forge-gui/res/cardsfolder/a/ardent_electromancer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/ardent_electromancer.txt rename to forge-gui/res/cardsfolder/a/ardent_electromancer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/ashaya_soul_of_the_wild.txt b/forge-gui/res/cardsfolder/a/ashaya_soul_of_the_wild.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/ashaya_soul_of_the_wild.txt rename to forge-gui/res/cardsfolder/a/ashaya_soul_of_the_wild.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/attended_healer.txt b/forge-gui/res/cardsfolder/a/attended_healer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/attended_healer.txt rename to forge-gui/res/cardsfolder/a/attended_healer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/bala_ged_recovery_bala_ged_sanctuary.txt b/forge-gui/res/cardsfolder/b/bala_ged_recovery_bala_ged_sanctuary.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/bala_ged_recovery_bala_ged_sanctuary.txt rename to forge-gui/res/cardsfolder/b/bala_ged_recovery_bala_ged_sanctuary.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/base_camp.txt b/forge-gui/res/cardsfolder/b/base_camp.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/base_camp.txt rename to forge-gui/res/cardsfolder/b/base_camp.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/beyeen_veil_beyeen_coast.txt b/forge-gui/res/cardsfolder/b/beyeen_veil_beyeen_coast.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/beyeen_veil_beyeen_coast.txt rename to forge-gui/res/cardsfolder/b/beyeen_veil_beyeen_coast.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/blackbloom_rogue_blackbloom_bog.txt b/forge-gui/res/cardsfolder/b/blackbloom_rogue_blackbloom_bog.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/blackbloom_rogue_blackbloom_bog.txt rename to forge-gui/res/cardsfolder/b/blackbloom_rogue_blackbloom_bog.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/blood_beckoning.txt b/forge-gui/res/cardsfolder/b/blood_beckoning.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/blood_beckoning.txt rename to forge-gui/res/cardsfolder/b/blood_beckoning.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/blood_price.txt b/forge-gui/res/cardsfolder/b/blood_price.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/blood_price.txt rename to forge-gui/res/cardsfolder/b/blood_price.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/bloodchiefs_thirst.txt b/forge-gui/res/cardsfolder/b/bloodchiefs_thirst.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/bloodchiefs_thirst.txt rename to forge-gui/res/cardsfolder/b/bloodchiefs_thirst.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/branchloft_pathway_boulderloft_pathway.txt b/forge-gui/res/cardsfolder/b/branchloft_pathway_boulderloft_pathway.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/branchloft_pathway_boulderloft_pathway.txt rename to forge-gui/res/cardsfolder/b/branchloft_pathway_boulderloft_pathway.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/brightclimb_pathway_grimclimb_pathway.txt b/forge-gui/res/cardsfolder/b/brightclimb_pathway_grimclimb_pathway.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/brightclimb_pathway_grimclimb_pathway.txt rename to forge-gui/res/cardsfolder/b/brightclimb_pathway_grimclimb_pathway.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/broken_wings.txt b/forge-gui/res/cardsfolder/b/broken_wings.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/broken_wings.txt rename to forge-gui/res/cardsfolder/b/broken_wings.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/brushfire_elemental.txt b/forge-gui/res/cardsfolder/b/brushfire_elemental.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/brushfire_elemental.txt rename to forge-gui/res/cardsfolder/b/brushfire_elemental.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/bubble_snare.txt b/forge-gui/res/cardsfolder/b/bubble_snare.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/bubble_snare.txt rename to forge-gui/res/cardsfolder/b/bubble_snare.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/canopy_baloth.txt b/forge-gui/res/cardsfolder/c/canopy_baloth.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/canopy_baloth.txt rename to forge-gui/res/cardsfolder/c/canopy_baloth.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/canyon_jerboa.txt b/forge-gui/res/cardsfolder/c/canyon_jerboa.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/canyon_jerboa.txt rename to forge-gui/res/cardsfolder/c/canyon_jerboa.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cascade_seer.txt b/forge-gui/res/cardsfolder/c/cascade_seer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cascade_seer.txt rename to forge-gui/res/cardsfolder/c/cascade_seer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/charix_the_raging_isle.txt b/forge-gui/res/cardsfolder/c/charix_the_raging_isle.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/charix_the_raging_isle.txt rename to forge-gui/res/cardsfolder/c/charix_the_raging_isle.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/chilling_trap.txt b/forge-gui/res/cardsfolder/c/chilling_trap.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/chilling_trap.txt rename to forge-gui/res/cardsfolder/c/chilling_trap.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cinderclasm.txt b/forge-gui/res/cardsfolder/c/cinderclasm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cinderclasm.txt rename to forge-gui/res/cardsfolder/c/cinderclasm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cleansing_wildfire.txt b/forge-gui/res/cardsfolder/c/cleansing_wildfire.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cleansing_wildfire.txt rename to forge-gui/res/cardsfolder/c/cleansing_wildfire.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/clearwater_pathway_murkwater_pathway.txt b/forge-gui/res/cardsfolder/c/clearwater_pathway_murkwater_pathway.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/clearwater_pathway_murkwater_pathway.txt rename to forge-gui/res/cardsfolder/c/clearwater_pathway_murkwater_pathway.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cleric_of_chill_depths.txt b/forge-gui/res/cardsfolder/c/cleric_of_chill_depths.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cleric_of_chill_depths.txt rename to forge-gui/res/cardsfolder/c/cleric_of_chill_depths.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cleric_of_lifes_bond.txt b/forge-gui/res/cardsfolder/c/cleric_of_lifes_bond.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cleric_of_lifes_bond.txt rename to forge-gui/res/cardsfolder/c/cleric_of_lifes_bond.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cliffhaven_kitesail.txt b/forge-gui/res/cardsfolder/c/cliffhaven_kitesail.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cliffhaven_kitesail.txt rename to forge-gui/res/cardsfolder/c/cliffhaven_kitesail.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cliffhaven_sell_sword.txt b/forge-gui/res/cardsfolder/c/cliffhaven_sell_sword.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cliffhaven_sell_sword.txt rename to forge-gui/res/cardsfolder/c/cliffhaven_sell_sword.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/concerted_defense.txt b/forge-gui/res/cardsfolder/c/concerted_defense.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/concerted_defense.txt rename to forge-gui/res/cardsfolder/c/concerted_defense.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/confounding_conundrum.txt b/forge-gui/res/cardsfolder/c/confounding_conundrum.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/confounding_conundrum.txt rename to forge-gui/res/cardsfolder/c/confounding_conundrum.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/coralhelm_chronicler.txt b/forge-gui/res/cardsfolder/c/coralhelm_chronicler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/coralhelm_chronicler.txt rename to forge-gui/res/cardsfolder/c/coralhelm_chronicler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/coveted_prize.txt b/forge-gui/res/cardsfolder/c/coveted_prize.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/coveted_prize.txt rename to forge-gui/res/cardsfolder/c/coveted_prize.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cragcrown_pathway_timbercrown_pathway.txt b/forge-gui/res/cardsfolder/c/cragcrown_pathway_timbercrown_pathway.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cragcrown_pathway_timbercrown_pathway.txt rename to forge-gui/res/cardsfolder/c/cragcrown_pathway_timbercrown_pathway.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cragplate_baloth.txt b/forge-gui/res/cardsfolder/c/cragplate_baloth.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cragplate_baloth.txt rename to forge-gui/res/cardsfolder/c/cragplate_baloth.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/crawling_barrens.txt b/forge-gui/res/cardsfolder/c/crawling_barrens.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/crawling_barrens.txt rename to forge-gui/res/cardsfolder/c/crawling_barrens.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cunning_geysermage.txt b/forge-gui/res/cardsfolder/c/cunning_geysermage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cunning_geysermage.txt rename to forge-gui/res/cardsfolder/c/cunning_geysermage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/dauntless_survivor.txt b/forge-gui/res/cardsfolder/d/dauntless_survivor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/dauntless_survivor.txt rename to forge-gui/res/cardsfolder/d/dauntless_survivor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/dauntless_unity.txt b/forge-gui/res/cardsfolder/d/dauntless_unity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/dauntless_unity.txt rename to forge-gui/res/cardsfolder/d/dauntless_unity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/deadly_alliance.txt b/forge-gui/res/cardsfolder/d/deadly_alliance.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/deadly_alliance.txt rename to forge-gui/res/cardsfolder/d/deadly_alliance.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/deliberate.txt b/forge-gui/res/cardsfolder/d/deliberate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/deliberate.txt rename to forge-gui/res/cardsfolder/d/deliberate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/demons_disciple.txt b/forge-gui/res/cardsfolder/d/demons_disciple.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/demons_disciple.txt rename to forge-gui/res/cardsfolder/d/demons_disciple.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/drana_the_last_bloodchief.txt b/forge-gui/res/cardsfolder/d/drana_the_last_bloodchief.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/drana_the_last_bloodchief.txt rename to forge-gui/res/cardsfolder/d/drana_the_last_bloodchief.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/dranas_silencer.txt b/forge-gui/res/cardsfolder/d/dranas_silencer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/dranas_silencer.txt rename to forge-gui/res/cardsfolder/d/dranas_silencer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/dreadwurm.txt b/forge-gui/res/cardsfolder/d/dreadwurm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/dreadwurm.txt rename to forge-gui/res/cardsfolder/d/dreadwurm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/emeria_captain.txt b/forge-gui/res/cardsfolder/e/emeria_captain.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/emeria_captain.txt rename to forge-gui/res/cardsfolder/e/emeria_captain.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/emerias_call_emeria_shattered_skyclave.txt b/forge-gui/res/cardsfolder/e/emerias_call_emeria_shattered_skyclave.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/emerias_call_emeria_shattered_skyclave.txt rename to forge-gui/res/cardsfolder/e/emerias_call_emeria_shattered_skyclave.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNC/enigma_thief.txt b/forge-gui/res/cardsfolder/e/enigma_thief.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNC/enigma_thief.txt rename to forge-gui/res/cardsfolder/e/enigma_thief.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/expedition_champion.txt b/forge-gui/res/cardsfolder/e/expedition_champion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/expedition_champion.txt rename to forge-gui/res/cardsfolder/e/expedition_champion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/expedition_diviner.txt b/forge-gui/res/cardsfolder/e/expedition_diviner.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/expedition_diviner.txt rename to forge-gui/res/cardsfolder/e/expedition_diviner.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/expedition_healer.txt b/forge-gui/res/cardsfolder/e/expedition_healer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/expedition_healer.txt rename to forge-gui/res/cardsfolder/e/expedition_healer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/expedition_skulker.txt b/forge-gui/res/cardsfolder/e/expedition_skulker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/expedition_skulker.txt rename to forge-gui/res/cardsfolder/e/expedition_skulker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/farsight_adept.txt b/forge-gui/res/cardsfolder/f/farsight_adept.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/farsight_adept.txt rename to forge-gui/res/cardsfolder/f/farsight_adept.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/fearless_fledgling.txt b/forge-gui/res/cardsfolder/f/fearless_fledgling.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/fearless_fledgling.txt rename to forge-gui/res/cardsfolder/f/fearless_fledgling.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/feed_the_swarm.txt b/forge-gui/res/cardsfolder/f/feed_the_swarm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/feed_the_swarm.txt rename to forge-gui/res/cardsfolder/f/feed_the_swarm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/felidar_retreat.txt b/forge-gui/res/cardsfolder/f/felidar_retreat.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/felidar_retreat.txt rename to forge-gui/res/cardsfolder/f/felidar_retreat.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/field_research.txt b/forge-gui/res/cardsfolder/f/field_research.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/field_research.txt rename to forge-gui/res/cardsfolder/f/field_research.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/fireblade_charger.txt b/forge-gui/res/cardsfolder/f/fireblade_charger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/fireblade_charger.txt rename to forge-gui/res/cardsfolder/f/fireblade_charger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/fissure_wizard.txt b/forge-gui/res/cardsfolder/f/fissure_wizard.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/fissure_wizard.txt rename to forge-gui/res/cardsfolder/f/fissure_wizard.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/forsaken_monument.txt b/forge-gui/res/cardsfolder/f/forsaken_monument.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/forsaken_monument.txt rename to forge-gui/res/cardsfolder/f/forsaken_monument.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNC/geode_rager.txt b/forge-gui/res/cardsfolder/g/geode_rager.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNC/geode_rager.txt rename to forge-gui/res/cardsfolder/g/geode_rager.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/ghastly_gloomhunter.txt b/forge-gui/res/cardsfolder/g/ghastly_gloomhunter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/ghastly_gloomhunter.txt rename to forge-gui/res/cardsfolder/g/ghastly_gloomhunter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/glacial_grasp.txt b/forge-gui/res/cardsfolder/g/glacial_grasp.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/glacial_grasp.txt rename to forge-gui/res/cardsfolder/g/glacial_grasp.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/glasspool_mimic_glasspool_shore.txt b/forge-gui/res/cardsfolder/g/glasspool_mimic_glasspool_shore.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/glasspool_mimic_glasspool_shore.txt rename to forge-gui/res/cardsfolder/g/glasspool_mimic_glasspool_shore.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/gnarlid_colony.txt b/forge-gui/res/cardsfolder/g/gnarlid_colony.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/gnarlid_colony.txt rename to forge-gui/res/cardsfolder/g/gnarlid_colony.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/goma_fada_vanguard.txt b/forge-gui/res/cardsfolder/g/goma_fada_vanguard.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/goma_fada_vanguard.txt rename to forge-gui/res/cardsfolder/g/goma_fada_vanguard.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/grakmaw_skyclave_ravager.txt b/forge-gui/res/cardsfolder/g/grakmaw_skyclave_ravager.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/grakmaw_skyclave_ravager.txt rename to forge-gui/res/cardsfolder/g/grakmaw_skyclave_ravager.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/grotag_bug_catcher.txt b/forge-gui/res/cardsfolder/g/grotag_bug_catcher.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/grotag_bug_catcher.txt rename to forge-gui/res/cardsfolder/g/grotag_bug_catcher.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/grotag_night_runner.txt b/forge-gui/res/cardsfolder/g/grotag_night_runner.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/grotag_night_runner.txt rename to forge-gui/res/cardsfolder/g/grotag_night_runner.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/guul_draz_mucklord.txt b/forge-gui/res/cardsfolder/g/guul_draz_mucklord.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/guul_draz_mucklord.txt rename to forge-gui/res/cardsfolder/g/guul_draz_mucklord.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/hagra_constrictor.txt b/forge-gui/res/cardsfolder/h/hagra_constrictor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/hagra_constrictor.txt rename to forge-gui/res/cardsfolder/h/hagra_constrictor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/hagra_mauling_hagra_broodpit.txt b/forge-gui/res/cardsfolder/h/hagra_mauling_hagra_broodpit.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/hagra_mauling_hagra_broodpit.txt rename to forge-gui/res/cardsfolder/h/hagra_mauling_hagra_broodpit.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/highborn_vampire.txt b/forge-gui/res/cardsfolder/h/highborn_vampire.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/highborn_vampire.txt rename to forge-gui/res/cardsfolder/h/highborn_vampire.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/inordinate_rage.txt b/forge-gui/res/cardsfolder/i/inordinate_rage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/inordinate_rage.txt rename to forge-gui/res/cardsfolder/i/inordinate_rage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/jace_mirror_mage.txt b/forge-gui/res/cardsfolder/j/jace_mirror_mage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/jace_mirror_mage.txt rename to forge-gui/res/cardsfolder/j/jace_mirror_mage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/joraga_visionary.txt b/forge-gui/res/cardsfolder/j/joraga_visionary.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/joraga_visionary.txt rename to forge-gui/res/cardsfolder/j/joraga_visionary.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/journey_to_oblivion.txt b/forge-gui/res/cardsfolder/j/journey_to_oblivion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/journey_to_oblivion.txt rename to forge-gui/res/cardsfolder/j/journey_to_oblivion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/jwari_disruption_jwari_ruins.txt b/forge-gui/res/cardsfolder/j/jwari_disruption_jwari_ruins.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/jwari_disruption_jwari_ruins.txt rename to forge-gui/res/cardsfolder/j/jwari_disruption_jwari_ruins.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kabira_outrider.txt b/forge-gui/res/cardsfolder/k/kabira_outrider.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kabira_outrider.txt rename to forge-gui/res/cardsfolder/k/kabira_outrider.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kabira_takedown_kabira_plateau.txt b/forge-gui/res/cardsfolder/k/kabira_takedown_kabira_plateau.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kabira_takedown_kabira_plateau.txt rename to forge-gui/res/cardsfolder/k/kabira_takedown_kabira_plateau.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kargan_intimidator.txt b/forge-gui/res/cardsfolder/k/kargan_intimidator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kargan_intimidator.txt rename to forge-gui/res/cardsfolder/k/kargan_intimidator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kargan_warleader.txt b/forge-gui/res/cardsfolder/k/kargan_warleader.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kargan_warleader.txt rename to forge-gui/res/cardsfolder/k/kargan_warleader.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kaza_roil_chaser.txt b/forge-gui/res/cardsfolder/k/kaza_roil_chaser.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kaza_roil_chaser.txt rename to forge-gui/res/cardsfolder/k/kaza_roil_chaser.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_mammoth_kazandu_valley.txt b/forge-gui/res/cardsfolder/k/kazandu_mammoth_kazandu_valley.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_mammoth_kazandu_valley.txt rename to forge-gui/res/cardsfolder/k/kazandu_mammoth_kazandu_valley.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_nectarpot.txt b/forge-gui/res/cardsfolder/k/kazandu_nectarpot.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_nectarpot.txt rename to forge-gui/res/cardsfolder/k/kazandu_nectarpot.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_stomper.txt b/forge-gui/res/cardsfolder/k/kazandu_stomper.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_stomper.txt rename to forge-gui/res/cardsfolder/k/kazandu_stomper.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kazuuls_fury_kazuuls_cliffs.txt b/forge-gui/res/cardsfolder/k/kazuuls_fury_kazuuls_cliffs.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kazuuls_fury_kazuuls_cliffs.txt rename to forge-gui/res/cardsfolder/k/kazuuls_fury_kazuuls_cliffs.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/khalni_ambush_khalni_territory.txt b/forge-gui/res/cardsfolder/k/khalni_ambush_khalni_territory.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/khalni_ambush_khalni_territory.txt rename to forge-gui/res/cardsfolder/k/khalni_ambush_khalni_territory.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kitesail_cleric.txt b/forge-gui/res/cardsfolder/k/kitesail_cleric.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kitesail_cleric.txt rename to forge-gui/res/cardsfolder/k/kitesail_cleric.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kor_blademaster.txt b/forge-gui/res/cardsfolder/k/kor_blademaster.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kor_blademaster.txt rename to forge-gui/res/cardsfolder/k/kor_blademaster.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kor_celebrant.txt b/forge-gui/res/cardsfolder/k/kor_celebrant.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kor_celebrant.txt rename to forge-gui/res/cardsfolder/k/kor_celebrant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/legion_angel.txt b/forge-gui/res/cardsfolder/l/legion_angel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/legion_angel.txt rename to forge-gui/res/cardsfolder/l/legion_angel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/leyline_tyrant.txt b/forge-gui/res/cardsfolder/l/leyline_tyrant.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/leyline_tyrant.txt rename to forge-gui/res/cardsfolder/l/leyline_tyrant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/linvala_shield_of_sea_gate.txt b/forge-gui/res/cardsfolder/l/linvala_shield_of_sea_gate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/linvala_shield_of_sea_gate.txt rename to forge-gui/res/cardsfolder/l/linvala_shield_of_sea_gate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/lithoform_blight.txt b/forge-gui/res/cardsfolder/l/lithoform_blight.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/lithoform_blight.txt rename to forge-gui/res/cardsfolder/l/lithoform_blight.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/living_tempest.txt b/forge-gui/res/cardsfolder/l/living_tempest.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/living_tempest.txt rename to forge-gui/res/cardsfolder/l/living_tempest.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/lullmages_domination.txt b/forge-gui/res/cardsfolder/l/lullmages_domination.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/lullmages_domination.txt rename to forge-gui/res/cardsfolder/l/lullmages_domination.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/lullmages_familiar.txt b/forge-gui/res/cardsfolder/l/lullmages_familiar.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/lullmages_familiar.txt rename to forge-gui/res/cardsfolder/l/lullmages_familiar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/luminarch_aspirant.txt b/forge-gui/res/cardsfolder/l/luminarch_aspirant.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/luminarch_aspirant.txt rename to forge-gui/res/cardsfolder/l/luminarch_aspirant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/maddening_cacophony.txt b/forge-gui/res/cardsfolder/m/maddening_cacophony.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/maddening_cacophony.txt rename to forge-gui/res/cardsfolder/m/maddening_cacophony.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/magmatic_channeler.txt b/forge-gui/res/cardsfolder/m/magmatic_channeler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/magmatic_channeler.txt rename to forge-gui/res/cardsfolder/m/magmatic_channeler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/makindi_ox.txt b/forge-gui/res/cardsfolder/m/makindi_ox.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/makindi_ox.txt rename to forge-gui/res/cardsfolder/m/makindi_ox.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/makindi_stampede_makindi_mesas.txt b/forge-gui/res/cardsfolder/m/makindi_stampede_makindi_mesas.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/makindi_stampede_makindi_mesas.txt rename to forge-gui/res/cardsfolder/m/makindi_stampede_makindi_mesas.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/malakir_blood_priest.txt b/forge-gui/res/cardsfolder/m/malakir_blood_priest.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/malakir_blood_priest.txt rename to forge-gui/res/cardsfolder/m/malakir_blood_priest.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/malakir_rebirth_malakir_mire.txt b/forge-gui/res/cardsfolder/m/malakir_rebirth_malakir_mire.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/malakir_rebirth_malakir_mire.txt rename to forge-gui/res/cardsfolder/m/malakir_rebirth_malakir_mire.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/marauding_blight_priest.txt b/forge-gui/res/cardsfolder/m/marauding_blight_priest.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/marauding_blight_priest.txt rename to forge-gui/res/cardsfolder/m/marauding_blight_priest.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/master_of_winds.txt b/forge-gui/res/cardsfolder/m/master_of_winds.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/master_of_winds.txt rename to forge-gui/res/cardsfolder/m/master_of_winds.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/maul_of_the_skyclaves.txt b/forge-gui/res/cardsfolder/m/maul_of_the_skyclaves.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/maul_of_the_skyclaves.txt rename to forge-gui/res/cardsfolder/m/maul_of_the_skyclaves.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/merfolk_falconer.txt b/forge-gui/res/cardsfolder/m/merfolk_falconer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/merfolk_falconer.txt rename to forge-gui/res/cardsfolder/m/merfolk_falconer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/merfolk_windrobber.txt b/forge-gui/res/cardsfolder/m/merfolk_windrobber.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/merfolk_windrobber.txt rename to forge-gui/res/cardsfolder/m/merfolk_windrobber.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/mesa_lynx.txt b/forge-gui/res/cardsfolder/m/mesa_lynx.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/mesa_lynx.txt rename to forge-gui/res/cardsfolder/m/mesa_lynx.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/might_of_murasa.txt b/forge-gui/res/cardsfolder/m/might_of_murasa.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/might_of_murasa.txt rename to forge-gui/res/cardsfolder/m/might_of_murasa.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/mind_carver.txt b/forge-gui/res/cardsfolder/m/mind_carver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/mind_carver.txt rename to forge-gui/res/cardsfolder/m/mind_carver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/mind_drain.txt b/forge-gui/res/cardsfolder/m/mind_drain.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/mind_drain.txt rename to forge-gui/res/cardsfolder/m/mind_drain.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/molten_blast.txt b/forge-gui/res/cardsfolder/m/molten_blast.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/molten_blast.txt rename to forge-gui/res/cardsfolder/m/molten_blast.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/moraug_fury_of_akoum.txt b/forge-gui/res/cardsfolder/m/moraug_fury_of_akoum.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/moraug_fury_of_akoum.txt rename to forge-gui/res/cardsfolder/m/moraug_fury_of_akoum.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/moss_pit_skeleton.txt b/forge-gui/res/cardsfolder/m/moss_pit_skeleton.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/moss_pit_skeleton.txt rename to forge-gui/res/cardsfolder/m/moss_pit_skeleton.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/murasa_brute.txt b/forge-gui/res/cardsfolder/m/murasa_brute.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/murasa_brute.txt rename to forge-gui/res/cardsfolder/m/murasa_brute.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/murasa_rootgrazer.txt b/forge-gui/res/cardsfolder/m/murasa_rootgrazer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/murasa_rootgrazer.txt rename to forge-gui/res/cardsfolder/m/murasa_rootgrazer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/murasa_sproutling.txt b/forge-gui/res/cardsfolder/m/murasa_sproutling.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/murasa_sproutling.txt rename to forge-gui/res/cardsfolder/m/murasa_sproutling.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/myriad_construct.txt b/forge-gui/res/cardsfolder/m/myriad_construct.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/myriad_construct.txt rename to forge-gui/res/cardsfolder/m/myriad_construct.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nahiri_heir_of_the_ancients.txt b/forge-gui/res/cardsfolder/n/nahiri_heir_of_the_ancients.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nahiri_heir_of_the_ancients.txt rename to forge-gui/res/cardsfolder/n/nahiri_heir_of_the_ancients.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nahiris_binding.txt b/forge-gui/res/cardsfolder/n/nahiris_binding.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nahiris_binding.txt rename to forge-gui/res/cardsfolder/n/nahiris_binding.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nahiris_lithoforming.txt b/forge-gui/res/cardsfolder/n/nahiris_lithoforming.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nahiris_lithoforming.txt rename to forge-gui/res/cardsfolder/n/nahiris_lithoforming.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/needleverge_pathway_pillarverge_pathway.txt b/forge-gui/res/cardsfolder/n/needleverge_pathway_pillarverge_pathway.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/needleverge_pathway_pillarverge_pathway.txt rename to forge-gui/res/cardsfolder/n/needleverge_pathway_pillarverge_pathway.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nighthawk_scavenger.txt b/forge-gui/res/cardsfolder/n/nighthawk_scavenger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nighthawk_scavenger.txt rename to forge-gui/res/cardsfolder/n/nighthawk_scavenger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nimana_skitter_sneak.txt b/forge-gui/res/cardsfolder/n/nimana_skitter_sneak.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nimana_skitter_sneak.txt rename to forge-gui/res/cardsfolder/n/nimana_skitter_sneak.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nimana_skydancer.txt b/forge-gui/res/cardsfolder/n/nimana_skydancer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nimana_skydancer.txt rename to forge-gui/res/cardsfolder/n/nimana_skydancer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nimble_trapfinder.txt b/forge-gui/res/cardsfolder/n/nimble_trapfinder.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nimble_trapfinder.txt rename to forge-gui/res/cardsfolder/n/nimble_trapfinder.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nissa_of_shadowed_boughs.txt b/forge-gui/res/cardsfolder/n/nissa_of_shadowed_boughs.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nissa_of_shadowed_boughs.txt rename to forge-gui/res/cardsfolder/n/nissa_of_shadowed_boughs.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nissas_zendikon.txt b/forge-gui/res/cardsfolder/n/nissas_zendikon.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nissas_zendikon.txt rename to forge-gui/res/cardsfolder/n/nissas_zendikon.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nullpriest_of_oblivion.txt b/forge-gui/res/cardsfolder/n/nullpriest_of_oblivion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nullpriest_of_oblivion.txt rename to forge-gui/res/cardsfolder/n/nullpriest_of_oblivion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/oblivions_hunger.txt b/forge-gui/res/cardsfolder/o/oblivions_hunger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/oblivions_hunger.txt rename to forge-gui/res/cardsfolder/o/oblivions_hunger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNC/obuun_mul_daya_ancestor.txt b/forge-gui/res/cardsfolder/o/obuun_mul_daya_ancestor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNC/obuun_mul_daya_ancestor.txt rename to forge-gui/res/cardsfolder/o/obuun_mul_daya_ancestor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/omnath_locus_of_creation.txt b/forge-gui/res/cardsfolder/o/omnath_locus_of_creation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/omnath_locus_of_creation.txt rename to forge-gui/res/cardsfolder/o/omnath_locus_of_creation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/ondu_inversion_ondu_skyruins.txt b/forge-gui/res/cardsfolder/o/ondu_inversion_ondu_skyruins.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/ondu_inversion_ondu_skyruins.txt rename to forge-gui/res/cardsfolder/o/ondu_inversion_ondu_skyruins.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/orah_skyclave_hierophant.txt b/forge-gui/res/cardsfolder/o/orah_skyclave_hierophant.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/orah_skyclave_hierophant.txt rename to forge-gui/res/cardsfolder/o/orah_skyclave_hierophant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/oran_rief_ooze.txt b/forge-gui/res/cardsfolder/o/oran_rief_ooze.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/oran_rief_ooze.txt rename to forge-gui/res/cardsfolder/o/oran_rief_ooze.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/paired_tactician.txt b/forge-gui/res/cardsfolder/p/paired_tactician.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/paired_tactician.txt rename to forge-gui/res/cardsfolder/p/paired_tactician.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/pelakka_predation_pelakka_caverns.txt b/forge-gui/res/cardsfolder/p/pelakka_predation_pelakka_caverns.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/pelakka_predation_pelakka_caverns.txt rename to forge-gui/res/cardsfolder/p/pelakka_predation_pelakka_caverns.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/phylath_world_sculptor.txt b/forge-gui/res/cardsfolder/p/phylath_world_sculptor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/phylath_world_sculptor.txt rename to forge-gui/res/cardsfolder/p/phylath_world_sculptor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/practiced_tactics.txt b/forge-gui/res/cardsfolder/p/practiced_tactics.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/practiced_tactics.txt rename to forge-gui/res/cardsfolder/p/practiced_tactics.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/prowling_felidar.txt b/forge-gui/res/cardsfolder/p/prowling_felidar.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/prowling_felidar.txt rename to forge-gui/res/cardsfolder/p/prowling_felidar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt b/forge-gui/res/cardsfolder/p/pyroclastic_hellion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/pyroclastic_hellion.txt rename to forge-gui/res/cardsfolder/p/pyroclastic_hellion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/ravagers_mace.txt b/forge-gui/res/cardsfolder/r/ravagers_mace.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/ravagers_mace.txt rename to forge-gui/res/cardsfolder/r/ravagers_mace.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/reclaim_the_wastes.txt b/forge-gui/res/cardsfolder/r/reclaim_the_wastes.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/reclaim_the_wastes.txt rename to forge-gui/res/cardsfolder/r/reclaim_the_wastes.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/relic_amulet.txt b/forge-gui/res/cardsfolder/r/relic_amulet.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/relic_amulet.txt rename to forge-gui/res/cardsfolder/r/relic_amulet.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/relic_axe.txt b/forge-gui/res/cardsfolder/r/relic_axe.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/relic_axe.txt rename to forge-gui/res/cardsfolder/r/relic_axe.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/relic_golem.txt b/forge-gui/res/cardsfolder/r/relic_golem.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/relic_golem.txt rename to forge-gui/res/cardsfolder/r/relic_golem.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/relic_robber.txt b/forge-gui/res/cardsfolder/r/relic_robber.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/relic_robber.txt rename to forge-gui/res/cardsfolder/r/relic_robber.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt b/forge-gui/res/cardsfolder/r/relic_vial.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/relic_vial.txt rename to forge-gui/res/cardsfolder/r/relic_vial.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/resolute_strike.txt b/forge-gui/res/cardsfolder/r/resolute_strike.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/resolute_strike.txt rename to forge-gui/res/cardsfolder/r/resolute_strike.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/risen_riptide.txt b/forge-gui/res/cardsfolder/r/risen_riptide.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/risen_riptide.txt rename to forge-gui/res/cardsfolder/r/risen_riptide.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/riverglide_pathway_lavaglide_pathway.txt b/forge-gui/res/cardsfolder/r/riverglide_pathway_lavaglide_pathway.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/riverglide_pathway_lavaglide_pathway.txt rename to forge-gui/res/cardsfolder/r/riverglide_pathway_lavaglide_pathway.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/rockslide_sorcerer.txt b/forge-gui/res/cardsfolder/r/rockslide_sorcerer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/rockslide_sorcerer.txt rename to forge-gui/res/cardsfolder/r/rockslide_sorcerer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/roil_eruption.txt b/forge-gui/res/cardsfolder/r/roil_eruption.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/roil_eruption.txt rename to forge-gui/res/cardsfolder/r/roil_eruption.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/roiling_regrowth.txt b/forge-gui/res/cardsfolder/r/roiling_regrowth.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/roiling_regrowth.txt rename to forge-gui/res/cardsfolder/r/roiling_regrowth.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/roiling_vortex.txt b/forge-gui/res/cardsfolder/r/roiling_vortex.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/roiling_vortex.txt rename to forge-gui/res/cardsfolder/r/roiling_vortex.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/roost_of_drakes.txt b/forge-gui/res/cardsfolder/r/roost_of_drakes.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/roost_of_drakes.txt rename to forge-gui/res/cardsfolder/r/roost_of_drakes.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/ruin_crab.txt b/forge-gui/res/cardsfolder/r/ruin_crab.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/ruin_crab.txt rename to forge-gui/res/cardsfolder/r/ruin_crab.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/scale_the_heights.txt b/forge-gui/res/cardsfolder/s/scale_the_heights.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/scale_the_heights.txt rename to forge-gui/res/cardsfolder/s/scale_the_heights.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/scavenged_blade.txt b/forge-gui/res/cardsfolder/s/scavenged_blade.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/scavenged_blade.txt rename to forge-gui/res/cardsfolder/s/scavenged_blade.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/scion_of_the_swarm.txt b/forge-gui/res/cardsfolder/s/scion_of_the_swarm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/scion_of_the_swarm.txt rename to forge-gui/res/cardsfolder/s/scion_of_the_swarm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/scorch_rider.txt b/forge-gui/res/cardsfolder/s/scorch_rider.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/scorch_rider.txt rename to forge-gui/res/cardsfolder/s/scorch_rider.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/scourge_of_the_skyclaves.txt b/forge-gui/res/cardsfolder/s/scourge_of_the_skyclaves.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/scourge_of_the_skyclaves.txt rename to forge-gui/res/cardsfolder/s/scourge_of_the_skyclaves.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/scute_swarm.txt b/forge-gui/res/cardsfolder/s/scute_swarm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/scute_swarm.txt rename to forge-gui/res/cardsfolder/s/scute_swarm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_banneret.txt b/forge-gui/res/cardsfolder/s/sea_gate_banneret.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_banneret.txt rename to forge-gui/res/cardsfolder/s/sea_gate_banneret.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_colossus.txt b/forge-gui/res/cardsfolder/s/sea_gate_colossus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_colossus.txt rename to forge-gui/res/cardsfolder/s/sea_gate_colossus.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_restoration_sea_gate_reborn.txt b/forge-gui/res/cardsfolder/s/sea_gate_restoration_sea_gate_reborn.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_restoration_sea_gate_reborn.txt rename to forge-gui/res/cardsfolder/s/sea_gate_restoration_sea_gate_reborn.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_stormcaller.txt b/forge-gui/res/cardsfolder/s/sea_gate_stormcaller.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_stormcaller.txt rename to forge-gui/res/cardsfolder/s/sea_gate_stormcaller.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/seafloor_stalker.txt b/forge-gui/res/cardsfolder/s/seafloor_stalker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/seafloor_stalker.txt rename to forge-gui/res/cardsfolder/s/seafloor_stalker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sejiri_shelter_sejiri_glacier.txt b/forge-gui/res/cardsfolder/s/sejiri_shelter_sejiri_glacier.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/sejiri_shelter_sejiri_glacier.txt rename to forge-gui/res/cardsfolder/s/sejiri_shelter_sejiri_glacier.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/shadow_stinger.txt b/forge-gui/res/cardsfolder/s/shadow_stinger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/shadow_stinger.txt rename to forge-gui/res/cardsfolder/s/shadow_stinger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/shadows_verdict.txt b/forge-gui/res/cardsfolder/s/shadows_verdict.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/shadows_verdict.txt rename to forge-gui/res/cardsfolder/s/shadows_verdict.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_charger.txt b/forge-gui/res/cardsfolder/s/shatterskull_charger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_charger.txt rename to forge-gui/res/cardsfolder/s/shatterskull_charger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_minotaur.txt b/forge-gui/res/cardsfolder/s/shatterskull_minotaur.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_minotaur.txt rename to forge-gui/res/cardsfolder/s/shatterskull_minotaur.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_smashing_shatterskull_the_hammer_pass.txt b/forge-gui/res/cardsfolder/s/shatterskull_smashing_shatterskull_the_hammer_pass.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_smashing_shatterskull_the_hammer_pass.txt rename to forge-gui/res/cardsfolder/s/shatterskull_smashing_shatterskull_the_hammer_pass.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/shell_shield.txt b/forge-gui/res/cardsfolder/s/shell_shield.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/shell_shield.txt rename to forge-gui/res/cardsfolder/s/shell_shield.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/shepherd_of_heroes.txt b/forge-gui/res/cardsfolder/s/shepherd_of_heroes.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/shepherd_of_heroes.txt rename to forge-gui/res/cardsfolder/s/shepherd_of_heroes.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/silundi_vision_silundi_isle.txt b/forge-gui/res/cardsfolder/s/silundi_vision_silundi_isle.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/silundi_vision_silundi_isle.txt rename to forge-gui/res/cardsfolder/s/silundi_vision_silundi_isle.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sizzling_barrage.txt b/forge-gui/res/cardsfolder/s/sizzling_barrage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/sizzling_barrage.txt rename to forge-gui/res/cardsfolder/s/sizzling_barrage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_apparition.txt b/forge-gui/res/cardsfolder/s/skyclave_apparition.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_apparition.txt rename to forge-gui/res/cardsfolder/s/skyclave_apparition.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_cleric_skyclave_basilica.txt b/forge-gui/res/cardsfolder/s/skyclave_cleric_skyclave_basilica.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_cleric_skyclave_basilica.txt rename to forge-gui/res/cardsfolder/s/skyclave_cleric_skyclave_basilica.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_geopede.txt b/forge-gui/res/cardsfolder/s/skyclave_geopede.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_geopede.txt rename to forge-gui/res/cardsfolder/s/skyclave_geopede.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_pick_axe.txt b/forge-gui/res/cardsfolder/s/skyclave_pick_axe.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_pick_axe.txt rename to forge-gui/res/cardsfolder/s/skyclave_pick_axe.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_plunder.txt b/forge-gui/res/cardsfolder/s/skyclave_plunder.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_plunder.txt rename to forge-gui/res/cardsfolder/s/skyclave_plunder.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_relic.txt b/forge-gui/res/cardsfolder/s/skyclave_relic.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_relic.txt rename to forge-gui/res/cardsfolder/s/skyclave_relic.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_sentinel.txt b/forge-gui/res/cardsfolder/s/skyclave_sentinel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_sentinel.txt rename to forge-gui/res/cardsfolder/s/skyclave_sentinel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_shade.txt b/forge-gui/res/cardsfolder/s/skyclave_shade.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_shade.txt rename to forge-gui/res/cardsfolder/s/skyclave_shade.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_shadowcat.txt b/forge-gui/res/cardsfolder/s/skyclave_shadowcat.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_shadowcat.txt rename to forge-gui/res/cardsfolder/s/skyclave_shadowcat.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_squid.txt b/forge-gui/res/cardsfolder/s/skyclave_squid.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_squid.txt rename to forge-gui/res/cardsfolder/s/skyclave_squid.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sneaking_guide.txt b/forge-gui/res/cardsfolder/s/sneaking_guide.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/sneaking_guide.txt rename to forge-gui/res/cardsfolder/s/sneaking_guide.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/soaring_thought_thief.txt b/forge-gui/res/cardsfolder/s/soaring_thought_thief.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/soaring_thought_thief.txt rename to forge-gui/res/cardsfolder/s/soaring_thought_thief.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/song_mad_treachery_song_mad_ruins.txt b/forge-gui/res/cardsfolder/s/song_mad_treachery_song_mad_ruins.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/song_mad_treachery_song_mad_ruins.txt rename to forge-gui/res/cardsfolder/s/song_mad_treachery_song_mad_ruins.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/soul_shatter.txt b/forge-gui/res/cardsfolder/s/soul_shatter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/soul_shatter.txt rename to forge-gui/res/cardsfolder/s/soul_shatter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/spare_supplies.txt b/forge-gui/res/cardsfolder/s/spare_supplies.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/spare_supplies.txt rename to forge-gui/res/cardsfolder/s/spare_supplies.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/spikefield_hazard_spikefield_cave.txt b/forge-gui/res/cardsfolder/s/spikefield_hazard_spikefield_cave.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/spikefield_hazard_spikefield_cave.txt rename to forge-gui/res/cardsfolder/s/spikefield_hazard_spikefield_cave.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/spitfire_lagac.txt b/forge-gui/res/cardsfolder/s/spitfire_lagac.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/spitfire_lagac.txt rename to forge-gui/res/cardsfolder/s/spitfire_lagac.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/spoils_of_adventure.txt b/forge-gui/res/cardsfolder/s/spoils_of_adventure.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/spoils_of_adventure.txt rename to forge-gui/res/cardsfolder/s/spoils_of_adventure.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/springmantle_cleric.txt b/forge-gui/res/cardsfolder/s/springmantle_cleric.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/springmantle_cleric.txt rename to forge-gui/res/cardsfolder/s/springmantle_cleric.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/squad_commander.txt b/forge-gui/res/cardsfolder/s/squad_commander.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/squad_commander.txt rename to forge-gui/res/cardsfolder/s/squad_commander.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/stonework_packbeast.txt b/forge-gui/res/cardsfolder/s/stonework_packbeast.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/stonework_packbeast.txt rename to forge-gui/res/cardsfolder/s/stonework_packbeast.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/strength_of_solidarity.txt b/forge-gui/res/cardsfolder/s/strength_of_solidarity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/strength_of_solidarity.txt rename to forge-gui/res/cardsfolder/s/strength_of_solidarity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sure_footed_infiltrator.txt b/forge-gui/res/cardsfolder/s/sure_footed_infiltrator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/sure_footed_infiltrator.txt rename to forge-gui/res/cardsfolder/s/sure_footed_infiltrator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/swarm_shambler.txt b/forge-gui/res/cardsfolder/s/swarm_shambler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/swarm_shambler.txt rename to forge-gui/res/cardsfolder/s/swarm_shambler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/synchronized_spellcraft.txt b/forge-gui/res/cardsfolder/s/synchronized_spellcraft.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/synchronized_spellcraft.txt rename to forge-gui/res/cardsfolder/s/synchronized_spellcraft.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/taborax_hopes_demise.txt b/forge-gui/res/cardsfolder/t/taborax_hopes_demise.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/taborax_hopes_demise.txt rename to forge-gui/res/cardsfolder/t/taborax_hopes_demise.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tajuru_blightblade.txt b/forge-gui/res/cardsfolder/t/tajuru_blightblade.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/tajuru_blightblade.txt rename to forge-gui/res/cardsfolder/t/tajuru_blightblade.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tajuru_paragon.txt b/forge-gui/res/cardsfolder/t/tajuru_paragon.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/tajuru_paragon.txt rename to forge-gui/res/cardsfolder/t/tajuru_paragon.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tajuru_snarecaster.txt b/forge-gui/res/cardsfolder/t/tajuru_snarecaster.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/tajuru_snarecaster.txt rename to forge-gui/res/cardsfolder/t/tajuru_snarecaster.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tangled_florahedron_tangled_vale.txt b/forge-gui/res/cardsfolder/t/tangled_florahedron_tangled_vale.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/tangled_florahedron_tangled_vale.txt rename to forge-gui/res/cardsfolder/t/tangled_florahedron_tangled_vale.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/taunting_arbormage.txt b/forge-gui/res/cardsfolder/t/taunting_arbormage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/taunting_arbormage.txt rename to forge-gui/res/cardsfolder/t/taunting_arbormage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tazeem_raptor.txt b/forge-gui/res/cardsfolder/t/tazeem_raptor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/tazeem_raptor.txt rename to forge-gui/res/cardsfolder/t/tazeem_raptor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tazeem_roilmage.txt b/forge-gui/res/cardsfolder/t/tazeem_roilmage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/tazeem_roilmage.txt rename to forge-gui/res/cardsfolder/t/tazeem_roilmage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tazri_beacon_of_unity.txt b/forge-gui/res/cardsfolder/t/tazri_beacon_of_unity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/tazri_beacon_of_unity.txt rename to forge-gui/res/cardsfolder/t/tazri_beacon_of_unity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/teeterpeak_ambusher.txt b/forge-gui/res/cardsfolder/t/teeterpeak_ambusher.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/teeterpeak_ambusher.txt rename to forge-gui/res/cardsfolder/t/teeterpeak_ambusher.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt b/forge-gui/res/cardsfolder/t/territorial_scythecat.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/territorial_scythecat.txt rename to forge-gui/res/cardsfolder/t/territorial_scythecat.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/thieving_skydiver.txt b/forge-gui/res/cardsfolder/t/thieving_skydiver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/thieving_skydiver.txt rename to forge-gui/res/cardsfolder/t/thieving_skydiver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/throne_of_makindi.txt b/forge-gui/res/cardsfolder/t/throne_of_makindi.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/throne_of_makindi.txt rename to forge-gui/res/cardsfolder/t/throne_of_makindi.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/thundering_rebuke.txt b/forge-gui/res/cardsfolder/t/thundering_rebuke.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/thundering_rebuke.txt rename to forge-gui/res/cardsfolder/t/thundering_rebuke.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/thundering_sparkmage.txt b/forge-gui/res/cardsfolder/t/thundering_sparkmage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/thundering_sparkmage.txt rename to forge-gui/res/cardsfolder/t/thundering_sparkmage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/thwart_the_grave.txt b/forge-gui/res/cardsfolder/t/thwart_the_grave.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/thwart_the_grave.txt rename to forge-gui/res/cardsfolder/t/thwart_the_grave.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNC/trove_warden.txt b/forge-gui/res/cardsfolder/t/trove_warden.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNC/trove_warden.txt rename to forge-gui/res/cardsfolder/t/trove_warden.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tuktuk_rubblefort.txt b/forge-gui/res/cardsfolder/t/tuktuk_rubblefort.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/tuktuk_rubblefort.txt rename to forge-gui/res/cardsfolder/t/tuktuk_rubblefort.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_ascetic.txt b/forge-gui/res/cardsfolder/t/turntimber_ascetic.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_ascetic.txt rename to forge-gui/res/cardsfolder/t/turntimber_ascetic.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_symbiosis_turntimber_serpentine_wood.txt b/forge-gui/res/cardsfolder/t/turntimber_symbiosis_turntimber_serpentine_wood.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/turntimber_symbiosis_turntimber_serpentine_wood.txt rename to forge-gui/res/cardsfolder/t/turntimber_symbiosis_turntimber_serpentine_wood.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/umara_mystic.txt b/forge-gui/res/cardsfolder/u/umara_mystic.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/umara_mystic.txt rename to forge-gui/res/cardsfolder/u/umara_mystic.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/umara_wizard_umara_skyfalls.txt b/forge-gui/res/cardsfolder/u/umara_wizard_umara_skyfalls.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/umara_wizard_umara_skyfalls.txt rename to forge-gui/res/cardsfolder/u/umara_wizard_umara_skyfalls.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/utility_knife.txt b/forge-gui/res/cardsfolder/u/utility_knife.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/utility_knife.txt rename to forge-gui/res/cardsfolder/u/utility_knife.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/valakut_awakening_valakut_stoneforge.txt b/forge-gui/res/cardsfolder/v/valakut_awakening_valakut_stoneforge.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/valakut_awakening_valakut_stoneforge.txt rename to forge-gui/res/cardsfolder/v/valakut_awakening_valakut_stoneforge.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/valakut_exploration.txt b/forge-gui/res/cardsfolder/v/valakut_exploration.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/valakut_exploration.txt rename to forge-gui/res/cardsfolder/v/valakut_exploration.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/vastwood_fortification_vastwood_thicket.txt b/forge-gui/res/cardsfolder/v/vastwood_fortification_vastwood_thicket.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/vastwood_fortification_vastwood_thicket.txt rename to forge-gui/res/cardsfolder/v/vastwood_fortification_vastwood_thicket.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/vastwood_surge.txt b/forge-gui/res/cardsfolder/v/vastwood_surge.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/vastwood_surge.txt rename to forge-gui/res/cardsfolder/v/vastwood_surge.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/veteran_adventurer.txt b/forge-gui/res/cardsfolder/v/veteran_adventurer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/veteran_adventurer.txt rename to forge-gui/res/cardsfolder/v/veteran_adventurer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/vine_gecko.txt b/forge-gui/res/cardsfolder/v/vine_gecko.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/vine_gecko.txt rename to forge-gui/res/cardsfolder/v/vine_gecko.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/wayward_guide_beast.txt b/forge-gui/res/cardsfolder/w/wayward_guide_beast.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/wayward_guide_beast.txt rename to forge-gui/res/cardsfolder/w/wayward_guide_beast.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNC/whispersteel_dagger.txt b/forge-gui/res/cardsfolder/w/whispersteel_dagger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNC/whispersteel_dagger.txt rename to forge-gui/res/cardsfolder/w/whispersteel_dagger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/windrider_wizard.txt b/forge-gui/res/cardsfolder/w/windrider_wizard.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/windrider_wizard.txt rename to forge-gui/res/cardsfolder/w/windrider_wizard.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/zagras_thief_of_heartbeats.txt b/forge-gui/res/cardsfolder/z/zagras_thief_of_heartbeats.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/zagras_thief_of_heartbeats.txt rename to forge-gui/res/cardsfolder/z/zagras_thief_of_heartbeats.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/zareth_san_the_trickster.txt b/forge-gui/res/cardsfolder/z/zareth_san_the_trickster.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/zareth_san_the_trickster.txt rename to forge-gui/res/cardsfolder/z/zareth_san_the_trickster.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/zof_consumption_zof_bloodbog.txt b/forge-gui/res/cardsfolder/z/zof_consumption_zof_bloodbog.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/zof_consumption_zof_bloodbog.txt rename to forge-gui/res/cardsfolder/z/zof_consumption_zof_bloodbog.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/zulaport_duelist.txt b/forge-gui/res/cardsfolder/z/zulaport_duelist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/zulaport_duelist.txt rename to forge-gui/res/cardsfolder/z/zulaport_duelist.txt From 24069739c475f2273acbb73970477b021b3ff627 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 25 Sep 2020 22:02:02 -0400 Subject: [PATCH 92/96] MillEffect.java more in line with new language --- .../src/main/java/forge/game/ability/effects/MillEffect.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 7b28f2427b4..7806099a99c 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 @@ -105,9 +105,7 @@ public class MillEffect extends SpellAbilityEffect { if (numCards != 1) { sb.append("s"); } - final String millPosition = sa.hasParam("FromBottom") ? "bottom" : "top"; - sb.append(" from the ").append(millPosition).append(" of their library."); - + sb.append("."); return sb.toString(); } From c8bd950581a2c9efd392ef4748a85e9f023e2c82 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 25 Sep 2020 22:02:43 -0400 Subject: [PATCH 93/96] Add StackDescription to make up for removing FromBottom from Mill stringbuilder --- forge-gui/res/cardsfolder/c/cellar_door.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/cellar_door.txt b/forge-gui/res/cardsfolder/c/cellar_door.txt index 2a0b0982396..d49f0c34a19 100644 --- a/forge-gui/res/cardsfolder/c/cellar_door.txt +++ b/forge-gui/res/cardsfolder/c/cellar_door.txt @@ -1,8 +1,7 @@ Name:Cellar Door ManaCost:2 Types:Artifact -A:AB$ Mill | Cost$ 3 T | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player | FromBottom$ True | RememberMilled$ True | SubAbility$ DBToken | SpellDescription$ Target player puts the bottom card of their library into their graveyard. If it's a creature card, you create a 2/2 black Zombie creature token. -SVar:DBToken:DB$ Token | LegacyImage$ b 2 2 zombie isd | TokenScript$ b_2_2_zombie | TokenOwner$ You | TokenAmount$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ1 | SubAbility$ DBCleanup +A:AB$ Mill | Cost$ 3 T | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player | FromBottom$ True | RememberMilled$ True | SubAbility$ DBToken | StackDescription$ {p:Targeted} puts the bottom card of their library into their graveyard. | SpellDescription$ Target player puts the bottom card of their library into their graveyard. If it's a creature card, you create a 2/2 black Zombie creature token. +SVar:DBToken:DB$ Token | TokenScript$ b_2_2_zombie | TokenOwner$ You | TokenAmount$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ1 | SubAbility$ DBCleanup | StackDescription$ If it's a creature card, {p:You} creates a 2/2 black Zombie creature token. | SpellDescription$ If it's a creature card, you create a 2/2 black Zombie creature token. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:Picture:http://www.wizards.com/global/images/magic/general/cellar_door.jpg Oracle:{3}, {T}: Target player puts the bottom card of their library into their graveyard. If it's a creature card, create a 2/2 black Zombie creature token. From 36da6b6c7f040d630cb55a207cb631d1cc98a95f Mon Sep 17 00:00:00 2001 From: Alessandro Coli Date: Sat, 26 Sep 2020 14:24:55 +0200 Subject: [PATCH 94/96] New options introduced to see the popup only for nonbasic lands. Trigger of the popup moved earlier so as the sound will play on its closure (when the lands enters play) and not on its opening. --- forge-game/src/main/java/forge/game/zone/Zone.java | 6 ++++-- .../forge/screens/home/settings/CSubmenuPreferences.java | 3 ++- .../src/main/java/forge/screens/match/CMatchUI.java | 5 ++++- .../src/main/java/forge/properties/ForgeConstants.java | 2 ++ 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/zone/Zone.java b/forge-game/src/main/java/forge/game/zone/Zone.java index 6f5088a34c6..5b3304b081f 100644 --- a/forge-game/src/main/java/forge/game/zone/Zone.java +++ b/forge-game/src/main/java/forge/game/zone/Zone.java @@ -125,8 +125,7 @@ public class Zone implements java.io.Serializable, Iterable { } } onChanged(); - game.fireEvent(new GameEventZone(zoneType, getPlayer(), EventValueChangeType.Added, c)); - + if(zoneType == ZoneType.Battlefield && c.isLand()) { PlayerCollection playerCollection = game.getPlayers(); int numPlayers = playerCollection.size(); @@ -138,6 +137,9 @@ public class Zone implements java.io.Serializable, Iterable { } } } + + game.fireEvent(new GameEventZone(zoneType, getPlayer(), EventValueChangeType.Added, c)); + } public final boolean contains(final Card c) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java index 69dbdb79ae7..09652cfddfd 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java @@ -451,7 +451,8 @@ public enum CSubmenuPreferences implements ICDoc { private void initializeLandPlayedComboBox() { final String[] elems = {ForgeConstants.LAND_PLAYED_NOTIFICATION_NEVER, ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS, - ForgeConstants.LAND_PLAYED_NOTIFICATION_AI}; + ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS_FOR_NONBASIC_LANDS, ForgeConstants.LAND_PLAYED_NOTIFICATION_AI, + ForgeConstants.LAND_PLAYED_NOTIFICATION_AI_FOR_NONBASIC_LANDS}; final FPref userSetting = FPref.UI_LAND_PLAYED_NOTIFICATION_POLICY; final FComboBoxPanel panel = this.view.getCbpLandPlayedComboBoxPanel(); final FComboBox comboBox = createComboBox(elems, userSetting); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 518b93ce7ed..c0133940a03 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -1454,7 +1454,10 @@ public final class CMatchUI String landPlayedNotificationPolicy = FModel.getPreferences().getPref(FPref.UI_LAND_PLAYED_NOTIFICATION_POLICY); Player cardController = land.getController(); boolean isAi = cardController.isAI(); - if(ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS.equals(landPlayedNotificationPolicy) || (ForgeConstants.LAND_PLAYED_NOTIFICATION_AI.equals(landPlayedNotificationPolicy) && (isAi))) { + if(ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS.equals(landPlayedNotificationPolicy) + || (ForgeConstants.LAND_PLAYED_NOTIFICATION_AI.equals(landPlayedNotificationPolicy) && (isAi)) + || (ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS_FOR_NONBASIC_LANDS.equals(landPlayedNotificationPolicy) && !land.isBasicLand()) + || (ForgeConstants.LAND_PLAYED_NOTIFICATION_AI_FOR_NONBASIC_LANDS.equals(landPlayedNotificationPolicy) && !land.isBasicLand()) && (isAi)) { String title = "Forge"; List options = ImmutableList.of(Localizer.getInstance().getMessage("lblOK")); diff --git a/forge-gui/src/main/java/forge/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/properties/ForgeConstants.java index 809d4e823d1..00c2bb02ecd 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/properties/ForgeConstants.java @@ -325,7 +325,9 @@ public final class ForgeConstants { // Constants for LAnd played notification policy public static final String LAND_PLAYED_NOTIFICATION_NEVER = "Never"; public static final String LAND_PLAYED_NOTIFICATION_ALWAYS = "Always"; + public static final String LAND_PLAYED_NOTIFICATION_ALWAYS_FOR_NONBASIC_LANDS = "Always, but only for nonbasic lands"; public static final String LAND_PLAYED_NOTIFICATION_AI = "Lands entering a battlefield because of an action of a AI player"; + public static final String LAND_PLAYED_NOTIFICATION_AI_FOR_NONBASIC_LANDS = "Nonbasic lands entering a battlefield because of an action of a AI player"; // Set boolean constant for landscape mode for gdx port public static final boolean isGdxPortLandscape = FileUtil.doesFileExist(ASSETS_DIR + "switch_orientation.ini"); From db6e23321a8d9d9005c1faa0da94df3e03e8708a Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 26 Sep 2020 21:14:45 +0800 Subject: [PATCH 95/96] refactor Border generation on Mobile. The Border images (currently White and Black) will now be based on pixel color from the card texture. It will get the pixel color from card texture pixel xy(1,1) on full images and texture reqion xy on fullborder images. This should fix card sets with mixed white and black bordered cards (example Magazine Insert set (PMEI)). --- .../src/forge/assets/ImageCache.java | 67 +++++++++++-------- .../src/forge/card/CardImage.java | 3 +- .../src/forge/card/CardImageRenderer.java | 9 ++- .../src/forge/card/CardRenderer.java | 12 ++-- 4 files changed, 48 insertions(+), 43 deletions(-) diff --git a/forge-gui-mobile/src/forge/assets/ImageCache.java b/forge-gui-mobile/src/forge/assets/ImageCache.java index 6880658f4f1..41af584d14f 100644 --- a/forge-gui-mobile/src/forge/assets/ImageCache.java +++ b/forge-gui-mobile/src/forge/assets/ImageCache.java @@ -19,6 +19,7 @@ package forge.assets; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Pixmap.Format; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.TextureRegion; @@ -39,7 +40,9 @@ import forge.properties.ForgeConstants; import forge.util.ImageUtil; import org.apache.commons.lang3.StringUtils; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -77,6 +80,7 @@ public class ImageCache { public static final Texture defaultImage; public static FImage BlackBorder = FSkinImage.IMG_BORDER_BLACK; public static FImage WhiteBorder = FSkinImage.IMG_BORDER_WHITE; + private static final Map Borders = new HashMap<>(); private static boolean imageLoaded, delayLoadRequested; public static void allowSingleLoad() { @@ -99,6 +103,7 @@ public class ImageCache { cache.invalidateAll(); cache.cleanUp(); missingIconKeys.clear(); + Borders.clear(); } public static void disposeTexture(){ @@ -181,6 +186,8 @@ public class ImageCache { if (useDefaultIfNotFound) { image = defaultImage; cache.put(imageKey, defaultImage); + if (Borders.get(image) == null) + Borders.put(image, false); //black border } } return image; @@ -192,8 +199,8 @@ public class ImageCache { e.printStackTrace(); } } - public static TextureRegion croppedBorderImage(Texture image, boolean fullborder) { - if (!fullborder) + public static TextureRegion croppedBorderImage(Texture image) { + if (!image.toString().contains(".fullborder.")) return new TextureRegion(image); float rscale = 0.96f; int rw = Math.round(image.getWidth()*rscale); @@ -202,25 +209,6 @@ public class ImageCache { int ry = Math.round((image.getHeight() - rh)/2f)-2; return new TextureRegion(image, rx, ry, rw, rh); } - public static boolean isWhiteBordered(IPaperCard c) { - if (c == null) - return false; - - CardEdition ed = FModel.getMagicDb().getEditions().get(c.getEdition()); - if (ed != null && ed.isWhiteBorder()) - return true; - return false; - } - public static boolean isWhiteBordered(CardView c) { - if (c == null) - return false; - - CardView.CardStateView state = c.getCurrentState(); - CardEdition ed = FModel.getMagicDb().getEditions().get(state.getSetCode()); - if (ed != null && ed.isWhiteBorder() && state.getFoilIndex() == 0) - return true; - return false; - } public static Color borderColor(IPaperCard c) { if (c == null) return Color.valueOf("#171717"); @@ -271,17 +259,38 @@ public class ImageCache { return true; return false; } - public static FImage getBorderImage(CardView c, boolean canshow) { + public static FImage getBorder(Texture t) { + if (Borders.get(t) == null) + Borders.put(t, isCloserToWhite(getpixelColor(t))); + return Borders.get(t) ? WhiteBorder : BlackBorder; + } + public static FImage getBorderImage(Texture t, boolean canshow) { if (!canshow) return BlackBorder; - if (isWhiteBordered(c)) - return WhiteBorder; - return BlackBorder; + return getBorder(t); } - public static FImage getBorderImage(IPaperCard c) { - if (isWhiteBordered(c)) - return WhiteBorder; - return BlackBorder; + public static FImage getBorderImage(Texture t) { + return getBorder(t); + } + public static String getpixelColor(Texture i) { + if (!i.getTextureData().isPrepared()) { + i.getTextureData().prepare(); //prepare texture + } + //get pixmap from texture data + Pixmap pixmap = i.getTextureData().consumePixmap(); + //get pixel color from x,y texture coordinate based on the image fullborder or not + Color color = new Color(pixmap.getPixel(croppedBorderImage(i).getRegionX()+1, croppedBorderImage(i).getRegionY()+1)); + pixmap.dispose(); + return color.toString(); + } + public static boolean isCloserToWhite(String c){ + if (c == null || c == "") + return false; + int c_r = Integer.parseInt(c.substring(0,2),16); + int c_g = Integer.parseInt(c.substring(2,4),16); + int c_b = Integer.parseInt(c.substring(4,6),16); + int brightness = ((c_r * 299) + (c_g * 587) + (c_b * 114)) / 1000; + return brightness > 155; } public static Color getTint(CardView c) { if (c == null) diff --git a/forge-gui-mobile/src/forge/card/CardImage.java b/forge-gui-mobile/src/forge/card/CardImage.java index ef841355c75..ae4d4a5456a 100644 --- a/forge-gui-mobile/src/forge/card/CardImage.java +++ b/forge-gui-mobile/src/forge/card/CardImage.java @@ -49,13 +49,12 @@ public class CardImage implements FImage { } else { if (Forge.enableUIMask) { - boolean fullborder = image.toString().contains(".fullborder."); if (ImageCache.isExtendedArt(card)) g.drawImage(image, x, y, w, h); else { float radius = (h - w)/8; g.drawfillBorder(3, ImageCache.borderColor(card), x, y, w, h, radius); - g.drawImage(ImageCache.croppedBorderImage(image, fullborder), x+radius/2.2f, y+radius/2, w*0.96f, h*0.96f); + g.drawImage(ImageCache.croppedBorderImage(image), x+radius/2.2f, y+radius/2, w*0.96f, h*0.96f); } } else diff --git a/forge-gui-mobile/src/forge/card/CardImageRenderer.java b/forge-gui-mobile/src/forge/card/CardImageRenderer.java index 969110d178c..8d9620fd2b2 100644 --- a/forge-gui-mobile/src/forge/card/CardImageRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardImageRenderer.java @@ -348,7 +348,6 @@ public class CardImageRenderer { if (image == ImageCache.defaultImage) { //support drawing card image manually if card image not found drawCardImage(g, card, altState, x, y, w, h, CardStackPosition.Top); } else { - boolean fullborder = image.toString().contains(".fullborder."); float radius = (h - w)/8; float wh_Adj = ForgeConstants.isGdxPortLandscape && isCurrentCard ? 1.38f:1.0f; float new_w = w*wh_Adj; @@ -371,7 +370,7 @@ public class CardImageRenderer { g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, -90); else { g.drawRotatedImage(FSkin.getBorders().get(0), new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, -90); - g.drawRotatedImage(ImageCache.croppedBorderImage(image, fullborder), new_x+radius/2-minusxy, new_y+radius/2-minusxy, new_w*croppedArea, new_h*croppedArea, (new_x+radius/2-minusxy) + (new_w*croppedArea) / 2, (new_y+radius/2-minusxy) + (new_h*croppedArea) / 2, -90); + g.drawRotatedImage(ImageCache.croppedBorderImage(image), new_x+radius/2-minusxy, new_y+radius/2-minusxy, new_w*croppedArea, new_h*croppedArea, (new_x+radius/2-minusxy) + (new_w*croppedArea) / 2, (new_y+radius/2-minusxy) + (new_h*croppedArea) / 2, -90); } } else g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, -90); @@ -382,7 +381,7 @@ public class CardImageRenderer { g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, isAftermath ? 90 : -90); else { g.drawRotatedImage(FSkin.getBorders().get(ImageCache.getFSkinBorders(card)), new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, isAftermath ? 90 : -90); - g.drawRotatedImage(ImageCache.croppedBorderImage(image, fullborder), new_x + radius / 2-minusxy, new_y + radius / 2-minusxy, new_w * croppedArea, new_h * croppedArea, (new_x + radius / 2-minusxy) + (new_w * croppedArea) / 2, (new_y + radius / 2-minusxy) + (new_h * croppedArea) / 2, isAftermath ? 90 : -90); + g.drawRotatedImage(ImageCache.croppedBorderImage(image), new_x + radius / 2-minusxy, new_y + radius / 2-minusxy, new_w * croppedArea, new_h * croppedArea, (new_x + radius / 2-minusxy) + (new_w * croppedArea) / 2, (new_y + radius / 2-minusxy) + (new_h * croppedArea) / 2, isAftermath ? 90 : -90); } } else g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, isAftermath ? 90 : -90); @@ -391,8 +390,8 @@ public class CardImageRenderer { if (ImageCache.isExtendedArt(card)) g.drawImage(image, x, y, w, h); else { - g.drawImage(ImageCache.getBorderImage(card, canshow), x, y, w, h); - g.drawImage(ImageCache.croppedBorderImage(image, fullborder), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea); + g.drawImage(ImageCache.getBorderImage(image, canshow), x, y, w, h); + g.drawImage(ImageCache.croppedBorderImage(image), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea); } } else { if (canshow) diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 46133714499..213e200db7d 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -459,13 +459,12 @@ public class CardRenderer { if (image == ImageCache.defaultImage) { CardImageRenderer.drawCardImage(g, CardView.getCardForUi(pc), false, x, y, w, h, pos); } else { - boolean fullborder = image.toString().contains(".fullborder."); if (Forge.enableUIMask) { if (ImageCache.isExtendedArt(pc)) g.drawImage(image, x, y, w, h); else { - g.drawImage(ImageCache.getBorderImage(pc), x, y, w, h); - g.drawImage(ImageCache.croppedBorderImage(image, fullborder), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea); + g.drawImage(ImageCache.getBorderImage(image), x, y, w, h); + g.drawImage(ImageCache.croppedBorderImage(image), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea); } } else g.drawImage(image, x, y, w, h); @@ -499,7 +498,6 @@ public class CardRenderer { if (image == ImageCache.defaultImage) { CardImageRenderer.drawCardImage(g, card, false, x, y, w, h, pos); } else { - boolean fullborder = image.toString().contains(".fullborder."); if(FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_ROTATE_PLANE_OR_PHENOMENON) && (card.getCurrentState().isPhenomenon() || card.getCurrentState().isPlane()) && rotate){ if (Forge.enableUIMask) { @@ -507,7 +505,7 @@ public class CardRenderer { g.drawRotatedImage(image, x, y, w, h, x + w / 2, y + h / 2, -90); else { g.drawRotatedImage(FSkin.getBorders().get(0), x, y, w, h, x + w / 2, y + h / 2, -90); - g.drawRotatedImage(ImageCache.croppedBorderImage(image, fullborder), x+radius/2.3f-minusxy, y+radius/2-minusxy, w*croppedArea, h*croppedArea, (x+radius/2.3f-minusxy) + (w*croppedArea) / 2, (y+radius/2-minusxy) + (h*croppedArea) / 2, -90); + g.drawRotatedImage(ImageCache.croppedBorderImage(image), x+radius/2.3f-minusxy, y+radius/2-minusxy, w*croppedArea, h*croppedArea, (x+radius/2.3f-minusxy) + (w*croppedArea) / 2, (y+radius/2-minusxy) + (h*croppedArea) / 2, -90); } } else g.drawRotatedImage(image, x, y, w, h, x + w / 2, y + h / 2, -90); @@ -517,8 +515,8 @@ public class CardRenderer { g.drawImage(image, x, y, w, h); else { boolean t = (card.getCurrentState().getOriginalColors() != card.getCurrentState().getColors()) || card.getCurrentState().hasChangeColors(); - g.drawBorderImage(ImageCache.getBorderImage(card, canshow), ImageCache.getTint(card), x, y, w, h, t); //tint check for changed colors - g.drawImage(ImageCache.croppedBorderImage(image, fullborder), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea); + g.drawBorderImage(ImageCache.getBorderImage(image, canshow), ImageCache.getTint(card), x, y, w, h, t); //tint check for changed colors + g.drawImage(ImageCache.croppedBorderImage(image), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea); } } else { if (canshow) From f08c11f930e864302cdde47828fcfa2819e6f627 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 27 Sep 2020 09:43:00 +0800 Subject: [PATCH 96/96] [Mobile] refactor Borderless Card Art generation. All borderless card art (currently hardcoded list - initial) will show borderless display. todo: add seperate textfile for custom borderless cards (should have limit since generating many texture would eat performance) --- .../src/forge/assets/ImageCache.java | 46 +---- .../src/forge/assets/ImageLoader.java | 186 +++++++++++++++++- .../src/forge/card/CardImage.java | 2 +- .../src/forge/card/CardImageRenderer.java | 6 +- .../src/forge/card/CardRenderer.java | 6 +- 5 files changed, 191 insertions(+), 55 deletions(-) diff --git a/forge-gui-mobile/src/forge/assets/ImageCache.java b/forge-gui-mobile/src/forge/assets/ImageCache.java index 41af584d14f..bf85d66b8fb 100644 --- a/forge-gui-mobile/src/forge/assets/ImageCache.java +++ b/forge-gui-mobile/src/forge/assets/ImageCache.java @@ -19,7 +19,6 @@ package forge.assets; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Pixmap.Format; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.TextureRegion; @@ -238,30 +237,15 @@ public class ImageCache { return 1; return 0; } - public static boolean isExtendedArt(CardView c) { - if (c == null) - return false; - - CardView.CardStateView state = c.getCurrentState(); - if (state.getSetCode().contains("MPS_")) - return true; - if (state.getSetCode().equalsIgnoreCase("UST")) - return true; - return false; + public static boolean isBorderlessCardArt(Texture t) { + return ImageLoader.isBorderless(t); } - public static boolean isExtendedArt(IPaperCard c) { - if (c == null) - return false; - - if (c.getEdition().contains("MPS_")) - return true; - if (c.getEdition().equalsIgnoreCase("UST")) - return true; - return false; + public static void updateBorders(Texture t, boolean val){ + Borders.put(t, val); } public static FImage getBorder(Texture t) { if (Borders.get(t) == null) - Borders.put(t, isCloserToWhite(getpixelColor(t))); + return BlackBorder; return Borders.get(t) ? WhiteBorder : BlackBorder; } public static FImage getBorderImage(Texture t, boolean canshow) { @@ -272,26 +256,6 @@ public class ImageCache { public static FImage getBorderImage(Texture t) { return getBorder(t); } - public static String getpixelColor(Texture i) { - if (!i.getTextureData().isPrepared()) { - i.getTextureData().prepare(); //prepare texture - } - //get pixmap from texture data - Pixmap pixmap = i.getTextureData().consumePixmap(); - //get pixel color from x,y texture coordinate based on the image fullborder or not - Color color = new Color(pixmap.getPixel(croppedBorderImage(i).getRegionX()+1, croppedBorderImage(i).getRegionY()+1)); - pixmap.dispose(); - return color.toString(); - } - public static boolean isCloserToWhite(String c){ - if (c == null || c == "") - return false; - int c_r = Integer.parseInt(c.substring(0,2),16); - int c_g = Integer.parseInt(c.substring(2,4),16); - int c_b = Integer.parseInt(c.substring(4,6),16); - int brightness = ((c_r * 299) + (c_g * 587) + (c_b * 114)) / 1000; - return brightness > 155; - } public static Color getTint(CardView c) { if (c == null) return Color.CLEAR; diff --git a/forge-gui-mobile/src/forge/assets/ImageLoader.java b/forge-gui-mobile/src/forge/assets/ImageLoader.java index 0137daa9f5e..064300ae635 100644 --- a/forge-gui-mobile/src/forge/assets/ImageLoader.java +++ b/forge-gui-mobile/src/forge/assets/ImageLoader.java @@ -1,6 +1,7 @@ package forge.assets; import java.io.File; +import java.util.ArrayList; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; @@ -13,24 +14,155 @@ import forge.FThreads; import forge.Forge; import forge.ImageKeys; +import forge.util.TextUtil; + +import static forge.assets.ImageCache.croppedBorderImage; final class ImageLoader extends CacheLoader { + private static ArrayList borderlessCardlistKey = new ArrayList() { + {//TODO: load the values from text list instead of hardcoded + add("2XM/Academy Ruins2.fullborder"); + add("2XM/Atraxa, Praetors' Voice2.fullborder"); + add("2XM/Avacyn, Angel of Hope2.fullborder"); + add("2XM/Batterskull2.fullborder"); + add("2XM/Blightsteel Colossus2.fullborder"); + add("2XM/Blood Moon2.fullborder"); + add("2XM/Brainstorm2.fullborder"); + add("2XM/Chrome Mox2.fullborder"); + add("2XM/Council's Judgment2.fullborder"); + add("2XM/Crop Rotation2.fullborder"); + add("2XM/Cyclonic Rift2.fullborder"); + add("2XM/Dark Confidant2.fullborder"); + add("2XM/Doubling Season2.fullborder"); + add("2XM/Expedition Map2.fullborder"); + add("2XM/Exploration2.fullborder"); + add("2XM/Fatal Push2.fullborder"); + add("2XM/Force of Will2.fullborder"); + add("2XM/Goblin Guide2.fullborder"); + add("2XM/Jace, the Mind Sculptor2.fullborder"); + add("2XM/Kaalia of the Vast2.fullborder"); + add("2XM/Karn Liberated2.fullborder"); + add("2XM/Lightning Greaves2.fullborder"); + add("2XM/Mana Crypt2.fullborder"); + add("2XM/Meddling Mage2.fullborder"); + add("2XM/Mox Opal2.fullborder"); + add("2XM/Noble Hierarch2.fullborder"); + add("2XM/Phyrexian Metamorph2.fullborder"); + add("2XM/Sneak Attack2.fullborder"); + add("2XM/Stoneforge Mystic2.fullborder"); + add("2XM/Sword of Body and Mind2.fullborder"); + add("2XM/Sword of Feast and Famine2.fullborder"); + add("2XM/Sword of Fire and Ice2.fullborder"); + add("2XM/Sword of Light and Shadow2.fullborder"); + add("2XM/Sword of War and Peace2.fullborder"); + add("2XM/Thoughtseize2.fullborder"); + add("2XM/Toxic Deluge2.fullborder"); + add("2XM/Urza's Mine2.fullborder"); + add("2XM/Urza's Power Plant2.fullborder"); + add("2XM/Urza's Tower2.fullborder"); + add("2XM/Wurmcoil Engine2.fullborder"); + add("ELD/Garruk, Cursed Huntsman2.fullborder"); + add("ELD/Oko, Thief of Crowns2.fullborder"); + add("ELD/The Royal Scions2.fullborder"); + add("IKO/Brokkos, Apex of Forever2.fullborder"); + add("IKO/Brokkos, Apex of Forever3.fullborder"); + add("IKO/Crystalline Giant3.fullborder"); + add("IKO/Cubwarden2.fullborder"); + add("IKO/Dirge Bat2.fullborder"); + add("IKO/Dirge Bat3.fullborder"); + add("IKO/Everquill Phoenix2.fullborder"); + add("IKO/Everquill Phoenix3.fullborder"); + add("IKO/Gemrazer2.fullborder"); + add("IKO/Gemrazer3.fullborder"); + add("IKO/Gyruda, Doom of Depths3.fullborder"); + add("IKO/Huntmaster Liger2.fullborder"); + add("IKO/Huntmaster Liger3.fullborder"); + add("IKO/Illuna, Apex of Wishes2.fullborder"); + add("IKO/Illuna, Apex of Wishes3.fullborder"); + add("IKO/Indatha Triome2.fullborder"); + add("IKO/Ketria Triome2.fullborder"); + add("IKO/Lukka, Coppercoat Outcast2.fullborder"); + add("IKO/Luminous Broodmoth3.fullborder"); + add("IKO/Mysterious Egg2.fullborder"); + add("IKO/Narset of the Ancient Way2.fullborder"); + add("IKO/Nethroi, Apex of Death2.fullborder"); + add("IKO/Nethroi, Apex of Death3.fullborder"); + add("IKO/Pollywog Symbiote2.fullborder"); + add("IKO/Raugrin Triome2.fullborder"); + add("IKO/Savai Triome2.fullborder"); + add("IKO/Sea-Dasher Octopus2.fullborder"); + add("IKO/Snapdax, Apex of the Hunt2.fullborder"); + add("IKO/Snapdax, Apex of the Hunt3.fullborder"); + add("IKO/Sprite Dragon3.fullborder"); + add("IKO/Titanoth Rex2.fullborder"); + add("IKO/Vadrok, Apex of Thunder2.fullborder"); + add("IKO/Vadrok, Apex of Thunder3.fullborder"); + add("IKO/Vivien, Monsters' Advocate2.fullborder"); + add("IKO/Void Beckoner2.fullborder"); + add("IKO/Yidaro, Wandering Monster3.fullborder"); + add("IKO/Zagoth Triome2.fullborder"); + add("IKO/Zilortha, Strength Incarnate.fullborder"); + add("M21/Basri Ket2.fullborder"); + add("M21/Chandra, Heart of Fire2.fullborder"); + add("M21/Containment Priest2.fullborder"); + add("M21/Cultivate2.fullborder"); + add("M21/Garruk, Unleashed2.fullborder"); + add("M21/Grim Tutor2.fullborder"); + add("M21/Liliana, Waker of the Dead2.fullborder"); + add("M21/Massacre Wurm2.fullborder"); + add("M21/Scavenging Ooze2.fullborder"); + add("M21/Solemn Simulacrum2.fullborder"); + add("M21/Teferi, Master of Time2.fullborder"); + add("M21/Ugin, the Spirit Dragon2.fullborder"); + add("M21/Ugin, the Spirit Dragon3.fullborder"); + add("PLGS/Hangarback Walker.fullborder"); + add("SLD/Acidic Slime.fullborder"); + add("SLD/Captain Sisay.fullborder"); + add("SLD/Meren of Clan Nel Toth.fullborder"); + add("SLD/Narset, Enlightened Master.fullborder"); + add("SLD/Necrotic Ooze.fullborder"); + add("SLD/Oona, Queen of the Fae.fullborder"); + add("SLD/Saskia the Unyielding.fullborder"); + add("SLD/The Mimeoplasm.fullborder"); + add("SLD/Voidslime.fullborder"); + add("THB/Ashiok, Nightmare Muse2.fullborder"); + add("THB/Calix, Destiny's Hand2.fullborder"); + add("THB/Elspeth, Sun's Nemesis2.fullborder"); + add("UST/Forest.fullborder"); + add("UST/Island.fullborder"); + add("UST/Mountain.fullborder"); + add("UST/Plains.fullborder"); + add("UST/Swamp.fullborder"); + add("ZNR/Boulderloft Pathway2.fullborder"); + add("ZNR/Branchloft Pathway2.fullborder"); + add("ZNR/Brightclimb Pathway2.fullborder"); + add("ZNR/Clearwater Pathway2.fullborder"); + add("ZNR/Cragcrown Pathway2.fullborder"); + add("ZNR/Grimclimb Pathway2.fullborder"); + add("ZNR/Jace, Mirror Mage2.fullborder"); + add("ZNR/Lavaglide Pathway2.fullborder"); + add("ZNR/Murkwater Pathway2.fullborder"); + add("ZNR/Nahiri, Heir of the Ancients2.fullborder"); + add("ZNR/Needleverge Pathway2.fullborder"); + add("ZNR/Nissa of Shadowed Boughs2.fullborder"); + add("ZNR/Pillarverge Pathway2.fullborder"); + add("ZNR/Riverglide Pathway2.fullborder"); + add("ZNR/Timbercrown Pathway2.fullborder"); + } + }; + Texture n; @Override public Texture load(String key) { - boolean extendedArt = false; + boolean extendedArt = isBorderless(key); boolean textureFilter = Forge.isTextureFilteringEnabled(); - if (key.length() > 4){ - if ((key.substring(0,4).contains("MPS_"))) //MPS_ sets - extendedArt = true; - else if ((key.substring(0,3).contains("UST"))) //Unstable Set - extendedArt = true; - } File file = ImageKeys.getImageFile(key); if (file != null) { FileHandle fh = new FileHandle(file); try { Texture t = new Texture(fh, textureFilter); + //update + ImageCache.updateBorders(t, extendedArt ? false: isCloserToWhite(getpixelColor(t))); if (textureFilter) t.setFilter(Texture.TextureFilter.MipMapLinearLinear, Texture.TextureFilter.Linear); if (extendedArt) @@ -106,4 +238,44 @@ final class ImageLoader extends CacheLoader { } } } + + public boolean isBorderless(String imagekey) { + if (imagekey.length() > 7) { + if ((!imagekey.substring(0, 7).contains("MPS_KLD"))&&(imagekey.substring(0, 4).contains("MPS_"))) //MPS_ sets except MPD_KLD + return true; + } + return borderlessCardlistKey.contains(TextUtil.fastReplace(imagekey,".full",".fullborder")); + } + + public static boolean isBorderless(Texture t) { + //generated texture/pixmap? + if (t.toString().contains("com.badlogic.gdx.graphics.Texture@")) + return true; + for (String key : borderlessCardlistKey) { + if (t.toString().contains(key)) + return true; + } + return false; + } + + public static String getpixelColor(Texture i) { + if (!i.getTextureData().isPrepared()) { + i.getTextureData().prepare(); //prepare texture + } + //get pixmap from texture data + Pixmap pixmap = i.getTextureData().consumePixmap(); + //get pixel color from x,y texture coordinate based on the image fullborder or not + Color color = new Color(pixmap.getPixel(croppedBorderImage(i).getRegionX()+1, croppedBorderImage(i).getRegionY()+1)); + pixmap.dispose(); + return color.toString(); + } + public static boolean isCloserToWhite(String c){ + if (c == null || c == "") + return false; + int c_r = Integer.parseInt(c.substring(0,2),16); + int c_g = Integer.parseInt(c.substring(2,4),16); + int c_b = Integer.parseInt(c.substring(4,6),16); + int brightness = ((c_r * 299) + (c_g * 587) + (c_b * 114)) / 1000; + return brightness > 155; + } } diff --git a/forge-gui-mobile/src/forge/card/CardImage.java b/forge-gui-mobile/src/forge/card/CardImage.java index ae4d4a5456a..a15772a51d7 100644 --- a/forge-gui-mobile/src/forge/card/CardImage.java +++ b/forge-gui-mobile/src/forge/card/CardImage.java @@ -49,7 +49,7 @@ public class CardImage implements FImage { } else { if (Forge.enableUIMask) { - if (ImageCache.isExtendedArt(card)) + if (ImageCache.isBorderlessCardArt(image)) g.drawImage(image, x, y, w, h); else { float radius = (h - w)/8; diff --git a/forge-gui-mobile/src/forge/card/CardImageRenderer.java b/forge-gui-mobile/src/forge/card/CardImageRenderer.java index 8d9620fd2b2..0295d1be631 100644 --- a/forge-gui-mobile/src/forge/card/CardImageRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardImageRenderer.java @@ -366,7 +366,7 @@ public class CardImageRenderer { } if (rotatePlane && (card.getCurrentState().isPhenomenon() || card.getCurrentState().isPlane())) { if (Forge.enableUIMask){ - if (ImageCache.isExtendedArt(card)) + if (ImageCache.isBorderlessCardArt(image)) g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, -90); else { g.drawRotatedImage(FSkin.getBorders().get(0), new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, -90); @@ -377,7 +377,7 @@ public class CardImageRenderer { } else if (rotateSplit && isCurrentCard && card.isSplitCard() && canshow) { boolean isAftermath = card.getText().contains("Aftermath") || card.getAlternateState().getOracleText().contains("Aftermath"); if (Forge.enableUIMask) { - if (ImageCache.isExtendedArt(card)) + if (ImageCache.isBorderlessCardArt(image)) g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, isAftermath ? 90 : -90); else { g.drawRotatedImage(FSkin.getBorders().get(ImageCache.getFSkinBorders(card)), new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, isAftermath ? 90 : -90); @@ -387,7 +387,7 @@ public class CardImageRenderer { g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, isAftermath ? 90 : -90); } else { if (Forge.enableUIMask && canshow) { - if (ImageCache.isExtendedArt(card)) + if (ImageCache.isBorderlessCardArt(image)) g.drawImage(image, x, y, w, h); else { g.drawImage(ImageCache.getBorderImage(image, canshow), x, y, w, h); diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 213e200db7d..3eb6ed751e2 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -460,7 +460,7 @@ public class CardRenderer { CardImageRenderer.drawCardImage(g, CardView.getCardForUi(pc), false, x, y, w, h, pos); } else { if (Forge.enableUIMask) { - if (ImageCache.isExtendedArt(pc)) + if (ImageCache.isBorderlessCardArt(image)) g.drawImage(image, x, y, w, h); else { g.drawImage(ImageCache.getBorderImage(image), x, y, w, h); @@ -501,7 +501,7 @@ public class CardRenderer { if(FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_ROTATE_PLANE_OR_PHENOMENON) && (card.getCurrentState().isPhenomenon() || card.getCurrentState().isPlane()) && rotate){ if (Forge.enableUIMask) { - if (ImageCache.isExtendedArt(card)) + if (ImageCache.isBorderlessCardArt(image)) g.drawRotatedImage(image, x, y, w, h, x + w / 2, y + h / 2, -90); else { g.drawRotatedImage(FSkin.getBorders().get(0), x, y, w, h, x + w / 2, y + h / 2, -90); @@ -511,7 +511,7 @@ public class CardRenderer { g.drawRotatedImage(image, x, y, w, h, x + w / 2, y + h / 2, -90); } else { if (Forge.enableUIMask && canshow) { - if (ImageCache.isExtendedArt(card)) + if (ImageCache.isBorderlessCardArt(image)) g.drawImage(image, x, y, w, h); else { boolean t = (card.getCurrentState().getOriginalColors() != card.getCurrentState().getColors()) || card.getCurrentState().hasChangeColors();