From cce2f711d8f0c0b3f2d33198d8a9dfdd0b5f4dc6 Mon Sep 17 00:00:00 2001 From: Renato Santos Date: Wed, 23 Feb 2022 13:12:21 +0000 Subject: [PATCH 01/16] Update forge-gui/res/cardsfolder/upcoming/rampant_rejuvenator.txt --- .../res/cardsfolder/upcoming/rampant_rejuvenator.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/rampant_rejuvenator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rampant_rejuvenator.txt b/forge-gui/res/cardsfolder/upcoming/rampant_rejuvenator.txt new file mode 100644 index 00000000000..f20968cfd25 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rampant_rejuvenator.txt @@ -0,0 +1,10 @@ +Name:Rampant Rejuvenator +ManaCost:3 G +Types:Creature Plant Hydra +PT:0/0 +K:etbCounter:P1P1:2 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME dies, search your library for up to X basic land cards, where X is CARDNAME's power, put them onto the battlefield, then shuffle. +SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ X +SVar:X:TriggeredCard$CardPower +DeckHas:Ability$Counters +Oracle:Rampant Rejuvenator enters the battlefield with two +1/+1 counters on it.\nWhen Rampant Rejuvenator dies, search your library for up to X basic land cards, where X is Rampant Rejuvenator's power, put them onto the battlefield, then shuffle. From db8e2e7c6fcd2d38b74a78d3b7089f4064a6dc2d Mon Sep 17 00:00:00 2001 From: Renato Santos Date: Wed, 23 Feb 2022 13:18:28 +0000 Subject: [PATCH 02/16] Update forge-gui/res/cardsfolder/upcoming/hidetsugu_consumes_all_vessel_of_the_all_consuming.txt --- ...nsumes_all_vessel_of_the_all_consuming.txt | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/hidetsugu_consumes_all_vessel_of_the_all_consuming.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hidetsugu_consumes_all_vessel_of_the_all_consuming.txt b/forge-gui/res/cardsfolder/upcoming/hidetsugu_consumes_all_vessel_of_the_all_consuming.txt new file mode 100644 index 00000000000..1d2bb65c199 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hidetsugu_consumes_all_vessel_of_the_all_consuming.txt @@ -0,0 +1,26 @@ +Name:Hidetsugu Consumes All +ManaCost:1 B R +Types:Enchantment Saga +K:Saga:3:DBDestroyAll,DBExile,DBTransform +SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Permanent.nonLand+cmcLE1 | SpellDescription$ Destroy each nonland permanent with mana value 1 or less. +SVar:DBExile:DB$ ChangeZoneAll | ChangeType$ Card | Origin$ Graveyard | Destination$ Exile | SpellDescription$ Exile all graveyards. +SVar:DBTransform:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn | SpellDescription$ Exile this Saga, then return it to the battlefield transformed under your control. +SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | Transformed$ True | GainControl$ True | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +AlternateMode:DoubleFaced +Oracle:(As this Saga enters and after your draw step, add a lore counter.)\nI — Destroy each nonland permanent with mana value 1 or less.\nII — Exile all graveyards.\nIII — Exile this Saga, then return it to the battlefield transformed under your control. + +ALTERNATE + +Name:Vessel of the All-Consuming +ManaCost:no cost +Colors:black,red +Types:Enchantment Creature Ogre Shaman +PT:3/3 +K:Trample +T:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, put a +1/+1 counter on it. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigLose | DamageToTargetThisTurnCondition$ GE10 | TriggerDescription$ Whenever CARDNAME deals damage to a player, if it has dealt 10 or more damage to that player this turn, they lose the game. +SVar:TrigLose:DB$ LosesGame | Defined$ TriggeredTarget +DeckHas:Ability$Counters +Oracle:Trample\nWhenever Vessel of the All-Consuming deals damage, put a +1/+1 counter on it.\nWhenever Vessel of the All-Consuming deals damage to a player, if it has dealt 10 or more damage to that player this turn, they lose the game. From 9ebc32c5ee499c0fa43842aff5ed8238f8112ca1 Mon Sep 17 00:00:00 2001 From: Renato Santos Date: Wed, 23 Feb 2022 13:22:59 +0000 Subject: [PATCH 03/16] Update forge-gui/res/cardsfolder/upcoming/mirror_box.txt --- forge-gui/res/cardsfolder/upcoming/mirror_box.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/mirror_box.txt b/forge-gui/res/cardsfolder/upcoming/mirror_box.txt index cf3a52408af..b54cf2f77ae 100644 --- a/forge-gui/res/cardsfolder/upcoming/mirror_box.txt +++ b/forge-gui/res/cardsfolder/upcoming/mirror_box.txt @@ -5,4 +5,4 @@ S:Mode$ Continuous | Affected$ Permanent.YouCtrl | AddHiddenKeyword$ Legend rule S:Mode$ Continuous | Affected$ Creature.Legendary+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Each legendary creature you control gets +1/+1. S:Mode$ Continuous | Affected$ Creature.nonToken+YouCtrl | AddPower$ AffectedX | AddToughness$ AffectedX | Description$ Each nontoken creature you control gets +1/+1 for each other creature you control with the same name as that creature. SVar:AffectedX:Count$Valid Creature.Other+sharesNameWith+YouCtrl -Oracle:The "legend rule" doesn’t apply to permanents you control.\nEach legendary creature you control gets +1/+1.\nEach nontoken creature you control gets +1/+1 for each other creature you control with the same name as that creature. +Oracle:The "legend rule" doesn't apply to permanents you control.\nEach legendary creature you control gets +1/+1.\nEach nontoken creature you control gets +1/+1 for each other creature you control with the same name as that creature. From 914237e850befc01d8f24539d2aa2d3fca65cd9a Mon Sep 17 00:00:00 2001 From: Renato Santos Date: Wed, 23 Feb 2022 13:49:07 +0000 Subject: [PATCH 04/16] Update forge-gui/res/cardsfolder/w/wildest_dreams.txt --- forge-gui/res/cardsfolder/w/wildest_dreams.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/w/wildest_dreams.txt b/forge-gui/res/cardsfolder/w/wildest_dreams.txt index 53c71843669..8304245ab27 100644 --- a/forge-gui/res/cardsfolder/w/wildest_dreams.txt +++ b/forge-gui/res/cardsfolder/w/wildest_dreams.txt @@ -1,8 +1,7 @@ Name:Wildest Dreams ManaCost:X X G Types:Sorcery -A:SP$ ChangeZone | Cost$ X X G | TargetMin$ X | TargetMax$ X | ValidTgts$ Card.YouOwn | TgtPrompt$ Select X target cards in your graveyard | Origin$ Graveyard | Destination$ Hand | R -eferences$ X | SubAbility$ DBExile | SpellDescription$ Return X target cards from your graveyard to your hand. Exile CARDNAME. +A:SP$ ChangeZone | Cost$ X X G | TargetMin$ X | TargetMax$ X | ValidTgts$ Card.YouOwn | TgtPrompt$ Select X target cards in your graveyard | Origin$ Graveyard | Destination$ Hand | References$ X | SubAbility$ DBExile | SpellDescription$ Return X target cards from your graveyard to your hand. Exile CARDNAME. SVar:DBExile:DB$ ChangeZone | Origin$ Stack | Destination$ Exile SVar:X:Count$xPaid DeckHas:Ability$Graveyard From 1251b8a02c9ac4a77e76b802d0c433b165a47b61 Mon Sep 17 00:00:00 2001 From: Renato Santos Date: Wed, 23 Feb 2022 15:02:09 +0000 Subject: [PATCH 05/16] Update forge-gui/res/cardsfolder/d/drake_stone.txt --- forge-gui/res/cardsfolder/d/drake_stone.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/d/drake_stone.txt b/forge-gui/res/cardsfolder/d/drake_stone.txt index d43e003db46..93f530562ba 100644 --- a/forge-gui/res/cardsfolder/d/drake_stone.txt +++ b/forge-gui/res/cardsfolder/d/drake_stone.txt @@ -1,6 +1,6 @@ Name:Drake Stone ManaCost:3 U B -Types:Planeswalker Stone +Types:Legendary Planeswalker Stone Loyalty:4 A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 1 | SubAbility$ DBDiscard | SpellDescription$ Draw a card, then each player discards a card. SVar:DBDiscard: DB$ Discard | NumCards$ 1 | Mode$ TgtChoose | Defined$ Player | SpellDescription$ Each player discards a card. From f64331ddc35cbbedc481a018ff2cb154dc4e1e89 Mon Sep 17 00:00:00 2001 From: Renato Santos Date: Wed, 23 Feb 2022 16:08:00 +0000 Subject: [PATCH 06/16] Update forge-gui/res/cardsfolder/l/leinore_autumn_sovereign.txt --- forge-gui/res/cardsfolder/l/leinore_autumn_sovereign.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/l/leinore_autumn_sovereign.txt b/forge-gui/res/cardsfolder/l/leinore_autumn_sovereign.txt index 6a834dca7db..0afafec11c9 100644 --- a/forge-gui/res/cardsfolder/l/leinore_autumn_sovereign.txt +++ b/forge-gui/res/cardsfolder/l/leinore_autumn_sovereign.txt @@ -1,6 +1,6 @@ Name:Leinore, Autumn Sovereign ManaCost:2 G W -Types:Legendary Creature Human Sovereign +Types:Legendary Creature Human Noble PT:0/4 T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Coven — At the beginning of combat on your turn, put a +1/+1 counter on target creature you control. Then if you control three or more creatures with different powers, draw a card. SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw From f3f9a7d99a31f59235b4adf25f80bad8247a10c7 Mon Sep 17 00:00:00 2001 From: Renato Santos Date: Wed, 23 Feb 2022 16:36:05 +0000 Subject: [PATCH 07/16] Update forge-gui/res/cardsfolder/w/wildest_dreams.txt --- forge-gui/res/cardsfolder/w/wildest_dreams.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/w/wildest_dreams.txt b/forge-gui/res/cardsfolder/w/wildest_dreams.txt index 8304245ab27..118b5878618 100644 --- a/forge-gui/res/cardsfolder/w/wildest_dreams.txt +++ b/forge-gui/res/cardsfolder/w/wildest_dreams.txt @@ -1,7 +1,7 @@ Name:Wildest Dreams ManaCost:X X G Types:Sorcery -A:SP$ ChangeZone | Cost$ X X G | TargetMin$ X | TargetMax$ X | ValidTgts$ Card.YouOwn | TgtPrompt$ Select X target cards in your graveyard | Origin$ Graveyard | Destination$ Hand | References$ X | SubAbility$ DBExile | SpellDescription$ Return X target cards from your graveyard to your hand. Exile CARDNAME. +A:SP$ ChangeZone | Cost$ X X G | TargetMin$ X | TargetMax$ X | ValidTgts$ Card.YouOwn | TgtPrompt$ Select X target cards in your graveyard | Origin$ Graveyard | Destination$ Hand | SubAbility$ DBExile | SpellDescription$ Return X target cards from your graveyard to your hand. Exile CARDNAME. SVar:DBExile:DB$ ChangeZone | Origin$ Stack | Destination$ Exile SVar:X:Count$xPaid DeckHas:Ability$Graveyard From c3da514145ea19a3563fab8c3ee7393f0e0ddc5b Mon Sep 17 00:00:00 2001 From: Renato Santos Date: Wed, 23 Feb 2022 17:17:47 +0000 Subject: [PATCH 08/16] Update forge-gui/res/cardsfolder/upcoming/jukai_preserver.txt --- forge-gui/res/cardsfolder/upcoming/jukai_preserver.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/jukai_preserver.txt b/forge-gui/res/cardsfolder/upcoming/jukai_preserver.txt index 8deb4df6cb3..9525a616609 100644 --- a/forge-gui/res/cardsfolder/upcoming/jukai_preserver.txt +++ b/forge-gui/res/cardsfolder/upcoming/jukai_preserver.txt @@ -1,6 +1,6 @@ Name:Jukai Preserver ManaCost:3 G -Types:Enchantment Creature — Human Druid +Types:Enchantment Creature Human Druid PT:3/3 T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | TriggerZones$ Battlefield | 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 From 59b7a560783a5c7bdfe4177bffc12d3bfcafcc1c Mon Sep 17 00:00:00 2001 From: Renato Santos Date: Wed, 23 Feb 2022 17:30:15 +0000 Subject: [PATCH 09/16] Update forge-gui/res/cardsfolder/upcoming/tanuki_transplanter.txt --- forge-gui/res/cardsfolder/upcoming/tanuki_transplanter.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/tanuki_transplanter.txt b/forge-gui/res/cardsfolder/upcoming/tanuki_transplanter.txt index 8b10e88a8d4..fcd462ba81d 100644 --- a/forge-gui/res/cardsfolder/upcoming/tanuki_transplanter.txt +++ b/forge-gui/res/cardsfolder/upcoming/tanuki_transplanter.txt @@ -1,6 +1,6 @@ Name:Tanuki Transplanter ManaCost:3 G -Types:Artifact Creature — Equipment Dog +Types:Artifact Creature Equipment Dog PT:2/4 T:Mode$ Attacks | ValidCard$ Card.Self,Creature.EquippedBy | Execute$ TrigMana | TriggerDescription$ Whenever CARDNAME or equipped creature attacks, add an amount of {G} equal to its power. Until end of turn, you don't lose this mana as steps and phases end. SVar:TrigMana:DB$ Mana | Produced$ G | Amount$ X | PersistentMana$ True From c2f2ab95504400348ad8b5892edfe966cea09999 Mon Sep 17 00:00:00 2001 From: Renato Santos Date: Wed, 23 Feb 2022 17:36:52 +0000 Subject: [PATCH 10/16] Update forge-gui/res/cardsfolder/t/teferis_veil.txt, forge-gui/res/cardsfolder/e/eerie_ultimatum.txt --- forge-gui/res/cardsfolder/e/eerie_ultimatum.txt | 2 +- forge-gui/res/cardsfolder/t/teferis_veil.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/e/eerie_ultimatum.txt b/forge-gui/res/cardsfolder/e/eerie_ultimatum.txt index ce81cfc7630..ecda79df8f6 100644 --- a/forge-gui/res/cardsfolder/e/eerie_ultimatum.txt +++ b/forge-gui/res/cardsfolder/e/eerie_ultimatum.txt @@ -3,5 +3,5 @@ ManaCost:W W B B B G G Types:Sorcery A:SP$ ChangeZone | Cost$ W W B B B G G | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Permanent.YouOwn | DifferentNames$ True | ChangeNum$ X | Hidden$ True | StackDescription$ SpellDescription | SpellDescription$ Return any number of permanent cards with different names from your graveyard to the battlefield. SVar:X:Count$DifferentCardNames_Permanent.YouOwn+inZoneGraveyard -Svar:IsReanimatorCard:TRUE +SVar:IsReanimatorCard:TRUE Oracle:Return any number of permanent cards with different names from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/t/teferis_veil.txt b/forge-gui/res/cardsfolder/t/teferis_veil.txt index e17d6319527..b216cc2fb9a 100644 --- a/forge-gui/res/cardsfolder/t/teferis_veil.txt +++ b/forge-gui/res/cardsfolder/t/teferis_veil.txt @@ -6,5 +6,5 @@ SVar:DelayedTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlay SVar:TrigPhase:DB$ Phases | Defined$ DelayTriggerRemembered AI:RemoveDeck:All SVar:NonStackingEffect:True -Svar:PlayMain1:TRUE +SVar:PlayMain1:TRUE Oracle:Whenever a creature you control attacks, it phases out at end of combat. (While it's phased out, it's treated as though it doesn't exist. It phases in before you untap during your next untap step.) From 82ca9452301c4326a5b9116ddf519b9a17ad7e48 Mon Sep 17 00:00:00 2001 From: Renato Santos Date: Wed, 23 Feb 2022 17:52:23 +0000 Subject: [PATCH 11/16] Update forge-gui/res/cardsfolder/s/stuffed_bear.txt --- forge-gui/res/cardsfolder/s/stuffed_bear.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/stuffed_bear.txt b/forge-gui/res/cardsfolder/s/stuffed_bear.txt index 8089df658b7..03fe3741b5a 100644 --- a/forge-gui/res/cardsfolder/s/stuffed_bear.txt +++ b/forge-gui/res/cardsfolder/s/stuffed_bear.txt @@ -2,4 +2,4 @@ Name:Stuffed Bear ManaCost:2 Types:Artifact A:AB$ Animate | Cost$ 2 | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Creature,Artifact,Bear | Colors$ Green | SpellDescription$ CARDNAME becomes a 4/4 green Bear artifact creature until end of turn. -Oracle: {2}: Stuffed Bear becomes a 4/4 green Bear artifact creature until end of turn. +Oracle:{2}: Stuffed Bear becomes a 4/4 green Bear artifact creature until end of turn. From 2d9774acea21cc4249c952bef83b82bafc9fcc88 Mon Sep 17 00:00:00 2001 From: Renato Santos Date: Wed, 23 Feb 2022 17:58:16 +0000 Subject: [PATCH 12/16] Update forge-gui/res/cardsfolder/upcoming/armguard_familiar.txt --- forge-gui/res/cardsfolder/upcoming/armguard_familiar.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/armguard_familiar.txt b/forge-gui/res/cardsfolder/upcoming/armguard_familiar.txt index 641086755b9..38a326d329e 100644 --- a/forge-gui/res/cardsfolder/upcoming/armguard_familiar.txt +++ b/forge-gui/res/cardsfolder/upcoming/armguard_familiar.txt @@ -5,4 +5,4 @@ PT:2/1 K:Ward:2 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 1 | AddKeyword$ Ward:2 | Description$ Equipped creature gets +2/+1 and has ward {2}. K:Reconfigure:4 -Oracle:Ward {2} (Whenever this creature becomes the target of a spell or ability an opponent controls, counter it unless that player pays {2}.)\nEquipped creature gets +2/+1 and has ward {2}.\nReconfigure {4} ({4}: Attach to target creature you control; or unattach from a creature. Reconfigure only as a sorcery. While attached, this isn’t a creature.) +Oracle:Ward {2} (Whenever this creature becomes the target of a spell or ability an opponent controls, counter it unless that player pays {2}.)\nEquipped creature gets +2/+1 and has ward {2}.\nReconfigure {4} ({4}: Attach to target creature you control; or unattach from a creature. Reconfigure only as a sorcery. While attached, this isn't a creature.) From 5413422245cc8fe7c94c846027b2e7f46f5aa8aa Mon Sep 17 00:00:00 2001 From: Renato Santos Date: Wed, 23 Feb 2022 18:13:47 +0000 Subject: [PATCH 13/16] Update forge-gui/res/cardsfolder/rebalanced/a-ellywick_tumblestrum.txt, forge-gui/res/cardsfolder/rebalanced/a-teferi_time_raveler.txt --- forge-gui/res/cardsfolder/rebalanced/a-ellywick_tumblestrum.txt | 2 +- forge-gui/res/cardsfolder/rebalanced/a-teferi_time_raveler.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/rebalanced/a-ellywick_tumblestrum.txt b/forge-gui/res/cardsfolder/rebalanced/a-ellywick_tumblestrum.txt index 10976362388..09848d0d36f 100644 --- a/forge-gui/res/cardsfolder/rebalanced/a-ellywick_tumblestrum.txt +++ b/forge-gui/res/cardsfolder/rebalanced/a-ellywick_tumblestrum.txt @@ -10,4 +10,4 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ Effect | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Ellywick Tumblestrum | Image$ emblem_ellywick_tumblestrum | StaticAbilities$ STOverrun | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Creatures you control have trample and haste and get +2/+2 for each differently named dungeon you've completed." SVar:STOverrun:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AffectedZone$ Battlefield | AddPower$ X | AddToughness$ X | AddKeyword$ Trample & Haste | Description$ Creatures you control have trample and haste and get +2/+2 for each differently named dungeon you've completed. SVar:X:PlayerCountPropertyYou$DifferentlyNamedDungeonsCompleted/Twice -Oracle:[+1]: Venture into the dungeon.\n[−2]: Look at the top six cards of your library. You may reveal a creature card from among them and put it into your hand. If it's legendary, you gain 3 life. Put the rest on the bottom of your library in a random order.\n[−6]: You get an emblem with "Creatures you control have trample and haste and get +2/+2 for each differently named dungeon you've completed." +Oracle:[+1]: Venture into the dungeon.\n[-2]: Look at the top six cards of your library. You may reveal a creature card from among them and put it into your hand. If it's legendary, you gain 3 life. Put the rest on the bottom of your library in a random order.\n[-6]: You get an emblem with "Creatures you control have trample and haste and get +2/+2 for each differently named dungeon you've completed." diff --git a/forge-gui/res/cardsfolder/rebalanced/a-teferi_time_raveler.txt b/forge-gui/res/cardsfolder/rebalanced/a-teferi_time_raveler.txt index 7b266bd48e0..800f50a2882 100644 --- a/forge-gui/res/cardsfolder/rebalanced/a-teferi_time_raveler.txt +++ b/forge-gui/res/cardsfolder/rebalanced/a-teferi_time_raveler.txt @@ -8,4 +8,4 @@ SVar:STPlay:Mode$ CastWithFlash | ValidCard$ Sorcery | ValidSA$ Spell | EffectZo SVar:PlayMain1:TRUE A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | Origin$ Battlefield | Destination$ Hand | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Artifact,Creature,Enchantment | TgtPrompt$ Select target artifact, creature, or enchantment | SpellDescription$ Return up to one target artifact, creature, or enchantment to its owner's hand. Draw a card. | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ 1 -Oracle:Your opponents can't cast spells during your turn.\n[+1]: Until your next turn, you may cast sorcery spells as though they had flash.\n[−3]: Return up to one target artifact, creature, or enchantment to its owner's hand. Draw a card. +Oracle:Your opponents can't cast spells during your turn.\n[+1]: Until your next turn, you may cast sorcery spells as though they had flash.\n[-3]: Return up to one target artifact, creature, or enchantment to its owner's hand. Draw a card. From ee482059f9fdabaa167874f5b35c9e0ddb302b8f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 24 Feb 2022 00:31:24 +0000 Subject: [PATCH 14/16] [Mobile] Update Adventure Layout and Fix Player name --- forge-gui-mobile/src/forge/Forge.java | 5 +- .../adventure/scene/AdventureDeckEditor.java | 2 +- .../adventure/scene/DeckSelectScene.java | 42 ++--- .../src/forge/adventure/scene/ForgeScene.java | 19 +- .../src/forge/adventure/scene/GameScene.java | 1 + .../src/forge/adventure/scene/InnScene.java | 21 +-- .../forge/adventure/scene/NewGameScene.java | 23 ++- .../adventure/scene/PlayerStatisticScene.java | 70 +++---- .../forge/adventure/scene/SaveLoadScene.java | 44 ++--- .../forge/adventure/scene/SettingsScene.java | 60 +++--- .../src/forge/adventure/scene/StartScene.java | 5 +- .../src/forge/adventure/stage/GameHUD.java | 15 +- .../src/forge/adventure/stage/MapStage.java | 4 + .../src/forge/adventure/stage/WorldStage.java | 12 +- .../src/forge/adventure/util/Controls.java | 6 +- .../src/forge/adventure/util/UIActor.java | 3 + .../src/forge/adventure/world/WorldSave.java | 2 + forge-gui-mobile/src/forge/card/CardZoom.java | 2 +- .../src/forge/deck/FDeckEditor.java | 172 ++++++++---------- .../screens/constructed/LobbyScreen.java | 4 + .../forge/screens/match/MatchController.java | 2 +- .../res/adventure/Shandalar/ui/blank.png | Bin 0 -> 1369 bytes .../adventure/Shandalar/ui/deck_selector.json | 75 ++++---- .../Shandalar/ui/deck_selector_mobile.json | 48 +++++ forge-gui/res/adventure/Shandalar/ui/heal.png | Bin 0 -> 13013 bytes forge-gui/res/adventure/Shandalar/ui/inn.json | 48 +++-- .../res/adventure/Shandalar/ui/leave.png | Bin 0 -> 14464 bytes .../Shandalar/ui/new_game_mobile.json | 163 +++++++++++++++++ .../Shandalar/ui/save_load_mobile.json | 68 +++++++ forge-gui/res/adventure/Shandalar/ui/sell.png | Bin 0 -> 12825 bytes .../Shandalar/ui/settings_mobile.json | 30 +++ .../adventure/Shandalar/ui/start_menu.json | 115 ++++++------ .../Shandalar/ui/start_menu_mobile.json | 67 +++++++ .../res/adventure/Shandalar/ui/statistic.json | 145 ++++++++------- 34 files changed, 847 insertions(+), 426 deletions(-) create mode 100644 forge-gui/res/adventure/Shandalar/ui/blank.png create mode 100644 forge-gui/res/adventure/Shandalar/ui/deck_selector_mobile.json create mode 100644 forge-gui/res/adventure/Shandalar/ui/heal.png create mode 100644 forge-gui/res/adventure/Shandalar/ui/leave.png create mode 100644 forge-gui/res/adventure/Shandalar/ui/new_game_mobile.json create mode 100644 forge-gui/res/adventure/Shandalar/ui/save_load_mobile.json create mode 100644 forge-gui/res/adventure/Shandalar/ui/sell.png create mode 100644 forge-gui/res/adventure/Shandalar/ui/settings_mobile.json create mode 100644 forge-gui/res/adventure/Shandalar/ui/start_menu_mobile.json diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index b295d5c4382..10ac4ea26e2 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -17,8 +17,10 @@ import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Clipboard; import com.badlogic.gdx.utils.ScreenUtils; import forge.adventure.scene.ForgeScene; +import forge.adventure.scene.GameScene; import forge.adventure.scene.Scene; import forge.adventure.scene.SceneType; +import forge.adventure.stage.MapStage; import forge.adventure.util.Config; import forge.animation.ForgeAnimation; import forge.assets.AssetsDownloader; @@ -887,7 +889,6 @@ public class Forge implements ApplicationListener { } public static boolean switchScene(Scene newScene) { - if (currentScene != null) { if (!currentScene.leave()) return false; @@ -895,6 +896,8 @@ public class Forge implements ApplicationListener { } storeScreen(); sceneWasSwapped =true; + if (newScene instanceof GameScene) + MapStage.getInstance().clearIsInMap(); currentScene = newScene; currentScene.enter(); return true; diff --git a/forge-gui-mobile/src/forge/adventure/scene/AdventureDeckEditor.java b/forge-gui-mobile/src/forge/adventure/scene/AdventureDeckEditor.java index 6fc9f8687d2..59c8e12b192 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/AdventureDeckEditor.java +++ b/forge-gui-mobile/src/forge/adventure/scene/AdventureDeckEditor.java @@ -54,8 +54,8 @@ import java.util.Map; private static ItemPool decksUsingMyCards=new ItemPool<>(InventoryItem.class); public static void leave() { AdventurePlayer.current().getNewCards().clear(); - Forge.switchScene(SceneType.DeckSelectScene.instance); Forge.clearCurrentScreen(); + Forge.switchToLast(); } @Override diff --git a/forge-gui-mobile/src/forge/adventure/scene/DeckSelectScene.java b/forge-gui-mobile/src/forge/adventure/scene/DeckSelectScene.java index a2eb0805322..1adb3cc029e 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/DeckSelectScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/DeckSelectScene.java @@ -16,6 +16,7 @@ import forge.Forge; import forge.adventure.player.AdventurePlayer; import forge.adventure.util.Controls; import forge.adventure.util.Current; +import forge.gui.GuiBase; public class DeckSelectScene extends UIScene { private final IntMap buttons = new IntMap<>(); @@ -27,19 +28,16 @@ public class DeckSelectScene extends UIScene { int currentSlot = 0; public DeckSelectScene() { - super("ui/deck_selector.json"); + super(GuiBase.isAndroid() ? "ui/deck_selector_mobile.json" : "ui/deck_selector.json"); } - - - private TextButton addDeckSlot(String name, int i) { TextButton button = Controls.newTextButton("-"); button.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { try { - if(!button.isDisabled()) + if (!button.isDisabled()) select(i); } catch (Exception e) { e.printStackTrace(); @@ -47,22 +45,21 @@ public class DeckSelectScene extends UIScene { } }); - layout.add(Controls.newLabel(name)).expandX(); - layout.add(button).expandX(); + layout.add(Controls.newLabel(name)).expandX().pad(2); + layout.add(button).expandX().pad(2); buttons.put(i, button); layout.row(); return button; - } public void back() { - Forge.switchScene(SceneType.GameScene.instance); + Forge.switchToLast(); } public boolean select(int slot) { currentSlot = slot; - for (IntMap.Entry butt : new IntMap.Entries (buttons)) { + for (IntMap.Entry butt : new IntMap.Entries(buttons)) { butt.value.setColor(defColor); } if (buttons.containsKey(slot)) { @@ -75,23 +72,19 @@ public class DeckSelectScene extends UIScene { } - @Override - public boolean keyPressed(int keycode) - { - if (keycode == Input.Keys.ESCAPE) - { + public boolean keyPressed(int keycode) { + if (keycode == Input.Keys.ESCAPE) { back(); } return true; } + @Override public void enter() { select(Current.player().getSelectedDeckIndex()); - for(int i=0;i diffList = new Array<>(starterDeck.length); - int i=0; - int startingDifficulty=0; - for (DifficultyData diff : Config.instance().getConfigData().difficulties) - { - if(diff.startingDifficulty) - startingDifficulty=i; + int i = 0; + int startingDifficulty = 0; + for (DifficultyData diff : Config.instance().getConfigData().difficulties) { + if (diff.startingDifficulty) + startingDifficulty = i; diffList.add(diff.name); i++; } difficulty.setTextList(diffList); difficulty.setCurrentIndex(startingDifficulty); - avatarIndex=rand.nextInt(); + avatarIndex = rand.nextInt(); gender.setCurrentIndex(rand.nextInt()); deck.setCurrentIndex(rand.nextInt()); race.setCurrentIndex(rand.nextInt()); diff --git a/forge-gui-mobile/src/forge/adventure/scene/PlayerStatisticScene.java b/forge-gui-mobile/src/forge/adventure/scene/PlayerStatisticScene.java index 6d8aa3ebf39..96da3b9f8a4 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/PlayerStatisticScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/PlayerStatisticScene.java @@ -11,19 +11,22 @@ import forge.Forge; import forge.adventure.character.EnemySprite; import forge.adventure.data.EnemyData; import forge.adventure.data.WorldData; +import forge.adventure.stage.GameHUD; import forge.adventure.util.Controls; import forge.adventure.util.Current; +import forge.player.GamePlayerUtil; import org.apache.commons.lang3.tuple.Pair; import java.util.Map; -public class PlayerStatisticScene extends UIScene { +public class PlayerStatisticScene extends UIScene { Image avatar; Label totalWins; Label totalLoss; Label lossWinRatio; + Label playerName; private Table enemiesGroup; public PlayerStatisticScene() { @@ -37,64 +40,64 @@ public class PlayerStatisticScene extends UIScene { @Override - public boolean keyPressed(int keycode) - { - if (keycode == Input.Keys.ESCAPE) - { + public boolean keyPressed(int keycode) { + if (keycode == Input.Keys.ESCAPE) { back(); } return true; } + public boolean back() { + GameHUD.getInstance().getTouchpad().setVisible(false); Forge.switchToLast(); return true; } + @Override public void enter() { super.enter(); enemiesGroup.clear(); - enemiesGroup.add("Avatar").align(Align.center).space(3,10,3,10); - enemiesGroup.add("Name").fillX().align(Align.center).fillX().space(3,10,3,60); - enemiesGroup.add(("Win")).align(Align.center).space(3,5,3,5); - enemiesGroup.add(("/")).align(Align.center).space(3,5,3,5); - enemiesGroup.add("Loss").align(Align.center).space(3,5,3,5); + enemiesGroup.add("Avatar").align(Align.center).space(3, 10, 3, 10); + enemiesGroup.add("Name").fillX().align(Align.center).fillX().space(3, 10, 3, 60); + enemiesGroup.add(("Win")).align(Align.center).space(3, 5, 3, 5); + enemiesGroup.add(("/")).align(Align.center).space(3, 5, 3, 5); + enemiesGroup.add("Loss").align(Align.center).space(3, 5, 3, 5); enemiesGroup.row().space(8); - if(avatar!=null) - { + if (playerName != null) { + playerName.setText(GamePlayerUtil.getGuiPlayer().getName()); + } + if (avatar != null) { avatar.setDrawable(new TextureRegionDrawable(Current.player().avatar())); } - if(totalWins!=null) - { + if (totalWins != null) { totalWins.setText(Current.player().getStatistic().totalWins()); } - if(totalLoss!=null) - { + if (totalLoss != null) { totalLoss.setText(Current.player().getStatistic().totalLoss()); } - if(lossWinRatio!=null) - { + if (lossWinRatio != null) { lossWinRatio.setText(Float.toString(Current.player().getStatistic().winLossRatio())); } - for(Map.Entry> entry : Current.player().getStatistic().getWinLossRecord().entrySet()) - { - EnemyData data=WorldData.getEnemy(entry.getKey()); - if(data==null)continue; - Image enemyImage=new Image(); + for (Map.Entry> entry : Current.player().getStatistic().getWinLossRecord().entrySet()) { + EnemyData data = WorldData.getEnemy(entry.getKey()); + if (data == null) continue; + Image enemyImage = new Image(); enemyImage.setDrawable(new TextureRegionDrawable(new EnemySprite(data).getAvatar())); - enemyImage.setSize(8,8); + enemyImage.setSize(8, 8); - enemiesGroup.add(enemyImage).align(Align.center).space(3,10,3,10); - enemiesGroup.add((data.name)).fillX().align(Align.center).fillX().space(3,10,3,10); - enemiesGroup.add((entry.getValue().getLeft().toString())).space(3,2,3,2); - enemiesGroup.add(("/")).align(Align.center).space(3,2,3,2); - enemiesGroup.add((entry.getValue().getRight().toString())).align(Align.center).space(0,2,0,2); + enemiesGroup.add(enemyImage).align(Align.center).space(3, 10, 3, 10); + enemiesGroup.add((data.name)).fillX().align(Align.center).fillX().space(3, 10, 3, 10); + enemiesGroup.add((entry.getValue().getLeft().toString())).space(3, 2, 3, 2); + enemiesGroup.add(("/")).align(Align.center).space(3, 2, 3, 2); + enemiesGroup.add((entry.getValue().getRight().toString())).align(Align.center).space(0, 2, 0, 2); enemiesGroup.row().space(8); } } + @Override public void resLoaded() { super.resLoaded(); @@ -107,11 +110,12 @@ public class PlayerStatisticScene extends UIScene { PlayerStatisticScene.this.back(); } }); - avatar=ui.findActor("avatar"); + avatar = ui.findActor("avatar"); + playerName = ui.findActor("playerName"); - totalWins=ui.findActor("totalWins"); - totalLoss=ui.findActor("totalLoss"); - lossWinRatio=ui.findActor("lossWinRatio"); + totalWins = ui.findActor("totalWins"); + totalLoss = ui.findActor("totalLoss"); + lossWinRatio = ui.findActor("lossWinRatio"); ScrollPane scrollPane = ui.findActor("enemies"); scrollPane.setActor(enemiesGroup); diff --git a/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java b/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java index 069e0823247..ae0222fa8ae 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java @@ -20,6 +20,7 @@ import forge.Forge; import forge.adventure.util.Controls; import forge.adventure.world.WorldSave; import forge.adventure.world.WorldSaveHeader; +import forge.gui.GuiBase; import forge.screens.TransitionScreen; import java.io.File; @@ -30,7 +31,6 @@ import java.util.zip.InflaterInputStream; /** * Scene to load and save the game. - * */ public class SaveLoadScene extends UIScene { private final IntMap buttons = new IntMap<>(); @@ -43,20 +43,18 @@ public class SaveLoadScene extends UIScene { Label header; int currentSlot = -3; Image previewImage; + Image previewBorder; TextButton saveLoadButton; TextButton quickSave; TextButton autoSave; public SaveLoadScene() { - super("ui/save_load.json"); + super(GuiBase.isAndroid() ? "ui/save_load_mobile.json" : "ui/save_load.json"); } - - private TextButton addSaveSlot(String name, int i) { - layout.add(Controls.newLabel(name)).colspan(1).align(Align.right).expandX(); - layout.add(Controls.newLabel(" ")); + layout.add(Controls.newLabel(name)).align(Align.left).pad(4, 10, 4, 15); TextButton button = Controls.newTextButton("..."); button.addListener(new ClickListener() { @Override @@ -69,7 +67,7 @@ public class SaveLoadScene extends UIScene { } } }); - layout.add(button).colspan(2).align(Align.left).expandX(); + layout.add(button).align(Align.left).expandX(); buttons.put(i, button); layout.row(); return button; @@ -88,9 +86,13 @@ public class SaveLoadScene extends UIScene { if (header.preview != null) { previewImage.setDrawable(new TextureRegionDrawable(new Texture(header.preview))); previewImage.layout(); + previewImage.setVisible(true); } + } else { + if (previewImage != null) + previewImage.setVisible(false); } - for (IntMap.Entry butt : new IntMap.Entries (buttons)) { + for (IntMap.Entry butt : new IntMap.Entries(buttons)) { butt.value.setColor(defColor); } if (buttons.containsKey(slot)) { @@ -123,18 +125,16 @@ public class SaveLoadScene extends UIScene { } @Override - public boolean keyPressed(int keycode) - { - if (keycode == Input.Keys.ESCAPE) - { - back(); + public boolean keyPressed(int keycode) { + if (keycode == Input.Keys.ESCAPE) { + back(); } return true; } + public void save() { dialog.hide(); - if( WorldSave.getCurrentSave().save(textInput.getText(), currentSlot)) - { + if (WorldSave.getCurrentSave().save(textInput.getText(), currentSlot)) { updateFiles(); Forge.switchScene(SceneType.GameScene.instance); } @@ -147,7 +147,7 @@ public class SaveLoadScene extends UIScene { File f = new File(WorldSave.getSaveDir()); f.mkdirs(); File[] names = f.listFiles(); - if(names==null) + if (names == null) throw new RuntimeException("Can not find save directory"); previews.clear(); for (File name : names) { @@ -159,7 +159,7 @@ public class SaveLoadScene extends UIScene { ObjectInputStream oos = new ObjectInputStream(inf)) { - int slot=WorldSave.filenameToSlot(name.getName()); + int slot = WorldSave.filenameToSlot(name.getName()); WorldSaveHeader header = (WorldSaveHeader) oos.readObject(); buttons.get(slot).setText(header.name); previews.put(slot, header); @@ -222,12 +222,14 @@ public class SaveLoadScene extends UIScene { })).align(Align.left); previewImage = ui.findActor("preview"); + previewBorder = ui.findActor("preview_border"); header = Controls.newLabel("Save"); header.setHeight(header.getHeight() * 2); - layout.add(header).colspan(3).align(Align.center).expand(); + header.setAlignment(Align.center); + layout.add(header).pad(2).colspan(4).align(Align.center).expand(); layout.row(); - autoSave=addSaveSlot("Auto save", WorldSave.AUTO_SAVE_SLOT); - quickSave=addSaveSlot("Quick save", WorldSave.QUICK_SAVE_SLOT); + autoSave = addSaveSlot("Auto save", WorldSave.AUTO_SAVE_SLOT); + quickSave = addSaveSlot("Quick save", WorldSave.QUICK_SAVE_SLOT); for (int i = 1; i < 11; i++) addSaveSlot("Slot:" + i, i); @@ -244,8 +246,8 @@ public class SaveLoadScene extends UIScene { SaveLoadScene.this.back(); } }); - defColor = saveLoadButton.getColor(); + defColor = saveLoadButton.getColor(); ScrollPane scrollPane = ui.findActor("saveSlots"); scrollPane.setActor(layout); diff --git a/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java b/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java index f0489a92478..44fd18d5180 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java @@ -15,6 +15,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.ui.TextField; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.utils.Align; +import com.badlogic.gdx.utils.Scaling; import forge.Forge; import forge.adventure.util.Config; import forge.adventure.util.Controls; @@ -37,7 +38,7 @@ public class SettingsScene extends UIScene { private Table settingGroup; public SettingsScene() { - super("ui/settings.json"); + super(GuiBase.isAndroid() ? "ui/settings_mobile.json" : "ui/settings.json"); } @@ -63,18 +64,18 @@ public class SettingsScene extends UIScene { } @Override - public boolean keyPressed(int keycode) - { - if (keycode == Input.Keys.ESCAPE) - { + public boolean keyPressed(int keycode) { + if (keycode == Input.Keys.ESCAPE) { back(); } return true; } + public boolean back() { Forge.switchToLast(); return true; } + private void addInputField(String name, ForgePreferences.FPref pref) { @@ -91,10 +92,14 @@ public class SettingsScene extends UIScene { addLabel(name); settingGroup.add(box).align(Align.right); } + private void addCheckBox(String name, ForgePreferences.FPref pref) { - - CheckBox box = Controls.newCheckBox(""); + if (GuiBase.isAndroid()) { + box.getImage().setScaling(Scaling.fill); + box.getImageCell().size(12, 12); + box.getImageCell().pad(2, 2, 2, 10); + } box.setChecked(Preference.getPrefBoolean(pref)); box.addListener(new ChangeListener() { @Override @@ -107,9 +112,9 @@ public class SettingsScene extends UIScene { addLabel(name); settingGroup.add(box).align(Align.right); } - private void addSettingSlider(String name, ForgePreferences.FPref pref, int min,int max) { - Slider slide = Controls.newSlider(min,max, 1, false); + private void addSettingSlider(String name, ForgePreferences.FPref pref, int min, int max) { + Slider slide = Controls.newSlider(min, max, 1, false); slide.setValue(Preference.getPrefInt(pref)); slide.addListener(new ChangeListener() { @Override @@ -121,17 +126,22 @@ public class SettingsScene extends UIScene { addLabel(name); settingGroup.add(slide).align(Align.right); } + private void addSettingField(String name, boolean value, ChangeListener change) { CheckBox box = Controls.newCheckBox(""); + if (GuiBase.isAndroid()) { + box.getImage().setScaling(Scaling.fill); + box.getImageCell().size(12, 12); + box.getImageCell().pad(2, 2, 2, 10); + } box.setChecked(value); box.addListener(change); addLabel(name); settingGroup.add(box).align(Align.right); } + private void addSettingField(String name, int value, ChangeListener change) { - - TextField text = Controls.newTextField(String.valueOf(value)); text.setTextFieldFilter(new TextField.TextFieldFilter() { @Override @@ -140,19 +150,16 @@ public class SettingsScene extends UIScene { } }); text.addListener(change); - - addLabel(name); settingGroup.add(text).align(Align.right); } - void addLabel( String name) - { - - Label label = new Label(name, Controls.GetSkin().get("white",Label.LabelStyle.class)); + void addLabel(String name) { + Label label = new Label(name, Controls.GetSkin().get("white", Label.LabelStyle.class)); settingGroup.row().space(5); - settingGroup.add(label).align(Align.left).fillX(); + settingGroup.add(label).align(Align.left).pad(2,2, 2, 5); } + @Override public void resLoaded() { super.resLoaded(); @@ -165,19 +172,19 @@ public class SettingsScene extends UIScene { SelectBox plane = Controls.newComboBox(Config.instance().getAllAdventures(), Config.instance().getSettingData().plane, new Function() { @Override public Void apply(Object o) { - Config.instance().getSettingData().plane= (String) o; + Config.instance().getSettingData().plane = (String) o; Config.instance().saveSettings(); return null; } }); addLabel("Plane"); - settingGroup.add(plane).align(Align.right); + settingGroup.add(plane).align(Align.right).pad(2); if (!GuiBase.isAndroid()) { SelectBox videomode = Controls.newComboBox(new String[]{"720p", "768p", "900p", "1080p"}, Config.instance().getSettingData().videomode, new Function() { @Override public Void apply(Object o) { - String mode = (String)o; + String mode = (String) o; if (mode == null) mode = "720p"; Config.instance().getSettingData().videomode = mode; @@ -204,12 +211,12 @@ public class SettingsScene extends UIScene { } }); addLabel("Video Mode (Restart to apply)"); - settingGroup.add(videomode).align(Align.right); + settingGroup.add(videomode).align(Align.right).pad(2); addSettingField("Fullscreen", Config.instance().getSettingData().fullScreen, new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { boolean value = ((CheckBox) actor).isChecked(); - Config.instance().getSettingData().fullScreen=value; + Config.instance().getSettingData().fullScreen = value; Config.instance().saveSettings(); //update if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_FULLSCREEN_MODE) != value) { @@ -220,10 +227,10 @@ public class SettingsScene extends UIScene { }); } addCheckBox(localizer.getMessage("lblCardName"), ForgePreferences.FPref.UI_OVERLAY_CARD_NAME); - addSettingSlider(localizer.getMessage("cbAdjustMusicVolume"), ForgePreferences.FPref.UI_VOL_MUSIC,0,100); - addSettingSlider(localizer.getMessage("cbAdjustSoundsVolume"), ForgePreferences.FPref.UI_VOL_SOUNDS, 0,100); + addSettingSlider(localizer.getMessage("cbAdjustMusicVolume"), ForgePreferences.FPref.UI_VOL_MUSIC, 0, 100); + addSettingSlider(localizer.getMessage("cbAdjustSoundsVolume"), ForgePreferences.FPref.UI_VOL_SOUNDS, 0, 100); addCheckBox(localizer.getMessage("lblManaCost"), ForgePreferences.FPref.UI_OVERLAY_CARD_MANA_COST); - addCheckBox(localizer.getMessage("lblPowerOrToughness"), ForgePreferences.FPref.UI_OVERLAY_CARD_POWER); + addCheckBox(localizer.getMessage("lblPowerOrToughness"), ForgePreferences.FPref.UI_OVERLAY_CARD_POWER); addCheckBox(localizer.getMessage("lblCardID"), ForgePreferences.FPref.UI_OVERLAY_CARD_ID); addCheckBox(localizer.getMessage("lblAbilityIcon"), ForgePreferences.FPref.UI_OVERLAY_ABILITY_ICONS); addCheckBox(localizer.getMessage("cbImageFetcher"), ForgePreferences.FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER); @@ -245,6 +252,7 @@ public class SettingsScene extends UIScene { settingGroup.row(); + ui.onButtonPress("return", new Runnable() { @Override public void run() { diff --git a/forge-gui-mobile/src/forge/adventure/scene/StartScene.java b/forge-gui-mobile/src/forge/adventure/scene/StartScene.java index 2cfb2468317..0b470677c2f 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/StartScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/StartScene.java @@ -4,7 +4,9 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.scenes.scene2d.Actor; import forge.Forge; +import forge.adventure.stage.GameHUD; import forge.adventure.world.WorldSave; +import forge.gui.GuiBase; /** * First scene after the splash screen @@ -16,7 +18,7 @@ public class StartScene extends UIScene { public StartScene() { - super("ui/start_menu.json"); + super(GuiBase.isAndroid() ? "ui/start_menu_mobile.json" : "ui/start_menu.json"); } public boolean NewGame() { @@ -38,6 +40,7 @@ public class StartScene extends UIScene { public boolean Resume() { Forge.switchToLast(); + GameHUD.getInstance().getTouchpad().setVisible(false); return true; } diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 0407761e4f3..8f7738c512a 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -13,10 +13,10 @@ import com.badlogic.gdx.scenes.scene2d.ui.Touchpad.TouchpadStyle; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.scenes.scene2d.utils.Drawable; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; -import com.badlogic.gdx.utils.viewport.FitViewport; +import com.badlogic.gdx.utils.Scaling; +import com.badlogic.gdx.utils.viewport.ScalingViewport; import forge.Forge; import forge.adventure.player.AdventurePlayer; -import forge.adventure.scene.Scene; import forge.adventure.scene.SceneType; import forge.adventure.util.Config; import forge.adventure.util.Current; @@ -46,7 +46,7 @@ public class GameHUD extends Stage { float TOUCHPAD_KNOB_MIN_WIDTH = 40f; private GameHUD(GameStage gameStage) { - super(new FitViewport(Scene.GetIntendedWidth(), Scene.GetIntendedHeight()), gameStage.getBatch()); + super(new ScalingViewport(Scaling.fillX, 480f, 270f), gameStage.getBatch()); instance = this; this.gameStage = gameStage; @@ -193,10 +193,11 @@ public class GameHUD extends Stage { float deckY = ui.findActor("deck").getY(); float deckR = ui.findActor("deck").getRight(); float deckT = ui.findActor("deck").getTop(); + float deckOriginX = ui.findActor("deck").getOriginX(); //deck button bounds if (c.x>=deckX&&c.x<=deckR&&c.y>=deckY&&c.y<=deckT) { openDeck(); - stageToScreenCoordinates(c2.set(deckX, deckY)); + stageToScreenCoordinates(c2.set(deckOriginX, deckY)); return super.touchDown((int)c2.x, (int)c2.y, pointer, button); } @@ -204,10 +205,11 @@ public class GameHUD extends Stage { float menuY = ui.findActor("menu").getY(); float menuR = ui.findActor("menu").getRight(); float menuT = ui.findActor("menu").getTop(); + float menuOriginX = ui.findActor("menu").getOriginX(); //menu button bounds if (c.x>=menuX&&c.x<=menuR&&c.y>=menuY&&c.y<=menuT) { menu(); - stageToScreenCoordinates(c2.set(menuX, menuY)); + stageToScreenCoordinates(c2.set(menuOriginX, menuY)); return super.touchDown((int)c2.x, (int)c2.y, pointer, button); } @@ -215,10 +217,11 @@ public class GameHUD extends Stage { float statsY = ui.findActor("statistic").getY(); float statsR = ui.findActor("statistic").getRight(); float statsT = ui.findActor("statistic").getTop(); + float statsOriginX = ui.findActor("statistic").getOriginX(); //stats button bounds if (c.x>=statsX&&c.x<=statsR&&c.y>=statsY&&c.y<=statsT) { statistic(); - stageToScreenCoordinates(c2.set(statsX, statsY)); + stageToScreenCoordinates(c2.set(statsOriginX, statsY)); return super.touchDown((int)c2.x, (int)c2.y, pointer, button); } diff --git a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java index 886f80f53fa..fa1192eabc5 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java @@ -58,6 +58,10 @@ public class MapStage extends GameStage { private final Vector2 oldPosition3=new Vector2(); private final Vector2 oldPosition4=new Vector2(); + public void clearIsInMap() { + isInMap = false; + } + public MapLayer getSpriteLayer() { diff --git a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java index 3271c556226..f4ce00f966e 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java @@ -1,8 +1,10 @@ package forge.adventure.stage; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.utils.ScreenUtils; import com.badlogic.gdx.utils.viewport.Viewport; import forge.Forge; import forge.adventure.character.CharacterSprite; @@ -20,6 +22,7 @@ import forge.adventure.util.SaveFileContent; import forge.adventure.util.SaveFileData; import forge.adventure.world.World; import forge.adventure.world.WorldSave; +import forge.screens.TransitionScreen; import org.apache.commons.lang3.tuple.Pair; import java.util.ArrayList; @@ -76,10 +79,17 @@ public class WorldStage extends GameStage implements SaveFileContent { if (player.collideWith(mob)) { player.setAnimation(CharacterSprite.AnimationTypes.Attack); mob.setAnimation(CharacterSprite.AnimationTypes.Attack); + Gdx.input.vibrate(50); + Forge.setCursor(null, Forge.magnifyToggle ? "1" : "2"); + Forge.setTransitionScreen(new TransitionScreen(new Runnable() { + @Override + public void run() { + Forge.clearTransitionScreen(); + } + }, ScreenUtils.getFrameBufferTexture(), true, false)); startPause(1, new Runnable() { @Override public void run() { - ((DuelScene) SceneType.DuelScene.instance).setEnemy(currentMob); ((DuelScene) SceneType.DuelScene.instance).setPlayer(player); Forge.switchScene(SceneType.DuelScene.instance); diff --git a/forge-gui-mobile/src/forge/adventure/util/Controls.java b/forge-gui-mobile/src/forge/adventure/util/Controls.java index aab97b4cc1f..2ed943b6e58 100644 --- a/forge-gui-mobile/src/forge/adventure/util/Controls.java +++ b/forge-gui-mobile/src/forge/adventure/util/Controls.java @@ -15,6 +15,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.TextButton; import com.badlogic.gdx.scenes.scene2d.ui.TextField; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.utils.Align; import java.util.function.Function; @@ -30,8 +31,8 @@ public class Controls { } static public SelectBox newComboBox(String[] text, String item, Function func) { - SelectBox ret = new SelectBox(GetSkin()); + ret.getStyle().listStyle.selection.setTopHeight(4); ret.setItems(text); ret.addListener(new ChangeListener() { @Override @@ -44,8 +45,9 @@ public class Controls { } }); func.apply(item); - + ret.getList().setAlignment(Align.center); ret.setSelected(item); + ret.setAlignment(Align.right); return ret; } diff --git a/forge-gui-mobile/src/forge/adventure/util/UIActor.java b/forge-gui-mobile/src/forge/adventure/util/UIActor.java index 31aa69cf44a..7d02320d897 100644 --- a/forge-gui-mobile/src/forge/adventure/util/UIActor.java +++ b/forge-gui-mobile/src/forge/adventure/util/UIActor.java @@ -137,6 +137,9 @@ public class UIActor extends Group { case "text": newActor.setText(property.value.toString()); break; + case "align": + newActor.setAlignment(((Float) property.value).intValue()); + break; } } } diff --git a/forge-gui-mobile/src/forge/adventure/world/WorldSave.java b/forge-gui-mobile/src/forge/adventure/world/WorldSave.java index 21d5e67bec3..4f2f5f4bf14 100644 --- a/forge-gui-mobile/src/forge/adventure/world/WorldSave.java +++ b/forge-gui-mobile/src/forge/adventure/world/WorldSave.java @@ -9,6 +9,7 @@ import forge.adventure.util.SaveFileData; import forge.adventure.util.SignalList; import forge.deck.Deck; import forge.localinstance.properties.ForgeProfileProperties; +import forge.player.GamePlayerUtil; import java.io.File; import java.io.FileInputStream; @@ -69,6 +70,7 @@ public class WorldSave { currentSave.header = (WorldSaveHeader) oos.readObject(); SaveFileData mainData=(SaveFileData)oos.readObject(); currentSave.player.load(mainData.readSubData("player")); + GamePlayerUtil.getGuiPlayer().setName(currentSave.player.getName()); currentSave.world.load(mainData.readSubData("world")); WorldStage.getInstance().load(mainData.readSubData("worldStage")); diff --git a/forge-gui-mobile/src/forge/card/CardZoom.java b/forge-gui-mobile/src/forge/card/CardZoom.java index 112747c94aa..1bcf288c1e0 100644 --- a/forge-gui-mobile/src/forge/card/CardZoom.java +++ b/forge-gui-mobile/src/forge/card/CardZoom.java @@ -284,7 +284,7 @@ public class CardZoom extends FOverlay { cardHeight = FCardPanel.ASPECT_RATIO * cardWidth; boolean rotateSplit = FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_ROTATE_SPLIT_CARDS); - if (currentCard.isSplitCard() && rotateSplit) { + if (currentCard != null && currentCard.isSplitCard() && rotateSplit) { // card will be rotated. Make sure that the height does not exceed the width of the view if (cardHeight > Gdx.graphics.getWidth()) { diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index ebcd835c019..74bb5b70f29 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -15,7 +15,6 @@ import forge.card.CardEdition; import forge.deck.io.DeckPreferences; import forge.gamemodes.limited.BoosterDraft; import forge.gamemodes.planarconquest.ConquestUtil; -import forge.gui.FThreads; import forge.gui.GuiBase; import forge.gui.card.CardPreferences; import forge.item.PaperCard; @@ -32,7 +31,6 @@ import forge.menu.FMenuItem; import forge.menu.FPopupMenu; import forge.model.FModel; import forge.screens.FScreen; -import forge.screens.LoadingOverlay; import forge.screens.TabPageScreen; import forge.toolbox.*; import forge.toolbox.FEvent.FEventHandler; @@ -1134,97 +1132,87 @@ public class FDeckEditor extends TabPageScreen { @Override public void refresh() { - FThreads.invokeInEdtLater(new Runnable() { - @Override - public void run() { - LoadingOverlay.show(Localizer.getInstance().getMessage("lblLoading"), new Runnable() { - @Override - public void run() { - Predicate additionalFilter = null; - final EditorType editorType = parentScreen.getEditorType(); - final Localizer localizer = Localizer.getInstance(); - switch (editorType) { - case Archenemy: - cardManager.setPool(FModel.getArchenemyCards(), true); - break; - case Planechase: - cardManager.setPool(FModel.getPlanechaseCards(), true); - break; - case Quest: - final ItemPool questPool = new ItemPool<>(PaperCard.class); - questPool.addAll(FModel.getQuest().getCards().getCardpool()); - // remove bottom cards that are in the deck from the card pool - questPool.removeAll(parentScreen.getDeck().getMain()); - // remove sideboard cards from the catalog - questPool.removeAll(parentScreen.getDeck().getOrCreate(DeckSection.Sideboard)); - cardManager.setPool(questPool); - break; - case PlanarConquest: - cardManager.setPool(ConquestUtil.getAvailablePool(parentScreen.getDeck())); - break; - case QuestCommander: - case Commander: - case Oathbreaker: - case TinyLeaders: - case Brawl: - final List commanders = parentScreen.getDeck().getCommanders(); - if (commanders.isEmpty()) { - //if no commander set for deck, only show valid commanders - switch (editorType) { - case Commander: - case QuestCommander: - additionalFilter = DeckFormat.Commander.isLegalCommanderPredicate(); - cardManager.setCaption(localizer.getMessage("lblCommanders")); - break; - case Oathbreaker: - additionalFilter = DeckFormat.Oathbreaker.isLegalCommanderPredicate(); - cardManager.setCaption(localizer.getMessage("lblOathbreakers")); - break; - case TinyLeaders: - additionalFilter = DeckFormat.TinyLeaders.isLegalCommanderPredicate(); - cardManager.setCaption(localizer.getMessage("lblCommanders")); - break; - case Brawl: - additionalFilter = DeckFormat.Brawl.isLegalCommanderPredicate(); - cardManager.setCaption(localizer.getMessage("lblCommanders")); - break; - default: - // Do nothing - } - } else { - //if a commander has been set, only show cards that match its color identity - switch (editorType) { - case Commander: - case QuestCommander: - additionalFilter = DeckFormat.Commander.isLegalCardForCommanderPredicate(commanders); - break; - case Oathbreaker: - additionalFilter = DeckFormat.Oathbreaker.isLegalCardForCommanderPredicate(commanders); - break; - case TinyLeaders: - additionalFilter = DeckFormat.TinyLeaders.isLegalCardForCommanderPredicate(commanders); - break; - case Brawl: - additionalFilter = DeckFormat.Brawl.isLegalCardForCommanderPredicate(commanders); - break; - default: - // Do nothing - } - cardManager.setCaption(localizer.getMessage("lblCards")); - } - // fall through to below - default: - if (cardManager.getWantUnique()) { - cardManager.setPool(editorType.applyCardFilter(FModel.getUniqueCardsNoAlt(), additionalFilter), true); - } else { - cardManager.setPool(editorType.applyCardFilter(FModel.getAllCardsNoAlt(), additionalFilter), true); - } - break; - } + Predicate additionalFilter = null; + final EditorType editorType = parentScreen.getEditorType(); + final Localizer localizer = Localizer.getInstance(); + switch (editorType) { + case Archenemy: + cardManager.setPool(FModel.getArchenemyCards(), true); + break; + case Planechase: + cardManager.setPool(FModel.getPlanechaseCards(), true); + break; + case Quest: + final ItemPool questPool = new ItemPool<>(PaperCard.class); + questPool.addAll(FModel.getQuest().getCards().getCardpool()); + // remove bottom cards that are in the deck from the card pool + questPool.removeAll(parentScreen.getDeck().getMain()); + // remove sideboard cards from the catalog + questPool.removeAll(parentScreen.getDeck().getOrCreate(DeckSection.Sideboard)); + cardManager.setPool(questPool); + break; + case PlanarConquest: + cardManager.setPool(ConquestUtil.getAvailablePool(parentScreen.getDeck())); + break; + case QuestCommander: + case Commander: + case Oathbreaker: + case TinyLeaders: + case Brawl: + final List commanders = parentScreen.getDeck().getCommanders(); + if (commanders.isEmpty()) { + //if no commander set for deck, only show valid commanders + switch (editorType) { + case Commander: + case QuestCommander: + additionalFilter = DeckFormat.Commander.isLegalCommanderPredicate(); + cardManager.setCaption(localizer.getMessage("lblCommanders")); + break; + case Oathbreaker: + additionalFilter = DeckFormat.Oathbreaker.isLegalCommanderPredicate(); + cardManager.setCaption(localizer.getMessage("lblOathbreakers")); + break; + case TinyLeaders: + additionalFilter = DeckFormat.TinyLeaders.isLegalCommanderPredicate(); + cardManager.setCaption(localizer.getMessage("lblCommanders")); + break; + case Brawl: + additionalFilter = DeckFormat.Brawl.isLegalCommanderPredicate(); + cardManager.setCaption(localizer.getMessage("lblCommanders")); + break; + default: + // Do nothing } - }); - } - }); + } else { + //if a commander has been set, only show cards that match its color identity + switch (editorType) { + case Commander: + case QuestCommander: + additionalFilter = DeckFormat.Commander.isLegalCardForCommanderPredicate(commanders); + break; + case Oathbreaker: + additionalFilter = DeckFormat.Oathbreaker.isLegalCardForCommanderPredicate(commanders); + break; + case TinyLeaders: + additionalFilter = DeckFormat.TinyLeaders.isLegalCardForCommanderPredicate(commanders); + break; + case Brawl: + additionalFilter = DeckFormat.Brawl.isLegalCardForCommanderPredicate(commanders); + break; + default: + // Do nothing + } + cardManager.setCaption(localizer.getMessage("lblCards")); + } + // fall through to below + default: + if (cardManager.getWantUnique()) { + cardManager.setPool(editorType.applyCardFilter(FModel.getUniqueCardsNoAlt(), additionalFilter), true); + } else { + cardManager.setPool(editorType.applyCardFilter(FModel.getAllCardsNoAlt(), additionalFilter), true); + } + break; + } } @Override diff --git a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java index 7350f457952..7d1555cd531 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java +++ b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import forge.player.GamePlayerUtil; import org.apache.commons.lang3.StringUtils; import com.badlogic.gdx.Gdx; @@ -326,6 +327,9 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { //TODO: Investigate why AI names cannot be overriden? updateName(i, getPlayerName(i)); + if(i == 0 && Forge.isMobileAdventureMode) { + updateName(0, GamePlayerUtil.getGuiPlayer().getName()); + } } FThreads.invokeInBackgroundThread(new Runnable() { //must call startGame in background thread in case there are alerts @Override diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index dc11c7310e1..e70ea8653ed 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -312,10 +312,10 @@ public class MatchController extends AbstractGuiGame { public void run() { Forge.clearTransitionScreen(); Forge.clearCurrentScreen(); - Forge.setCursor(null, "0"); } }; Forge.setTransitionScreen(new TransitionScreen(runnable, ScreenUtils.getFrameBufferTexture(), false, false)); + Forge.setCursor(null, "0"); return; } if (hasLocalPlayers() || getGameView().isMatchOver()) { diff --git a/forge-gui/res/adventure/Shandalar/ui/blank.png b/forge-gui/res/adventure/Shandalar/ui/blank.png new file mode 100644 index 0000000000000000000000000000000000000000..a81df58420200ac087ba9b0907a112e726e8abe9 GIT binary patch literal 1369 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 z z=TWRo%_3D`C)Co!sv~Je4lEB&0qHQw&669W^~}h#2^OEpKa_Wjx&XPiRL77U5(qxn zVV`Z+sR`eT;jgqenMA(W0U4*N6QVI#hkr(|6Le?54En&M3n3f6msa3f+-WwT>qsbS z3H5zkH;XvehMd=RfE;i*7S{^{wkU6RuGYW0JnwIMO8fiiO)%5fyS2n@PW_b4e9Fd- z5`jlRHXFdFldXo#+P^z^vv)9@H>KwlnM=i7kP&R6U^MGDOS#Xv^H=I{h5$KNfrNd0 zrV#W&2lYyusWO{4^J8*^g3zqF9O6rnk#uPsT;h!JxP&->COdN}l9i_7vU@aZCBVT! z=~?V9%LU7@#-|*P@+PXaQZgG(WjWG1JTB-)#7aJ+@OEqO9W(f(@SfxJm4~if;FV9C z$6Xwp|5UjalhX0WZbL^(*IUPu`w3Us5ezDf0dm^voBP(Cfz*{$rmHmRPF}63Y-6}j z$Wl_CM%_KqWA+i+0F&3Nd$}+cXKw7p_9iMf6=f_&)alHRB?>~*>R$9-_&1Te9V%; zUHsX@x&AwW;e>4?INdeSH&Vg+m*~0k#J~;8au%imHud#M z8|H}>jyGF2l00IaHQuB=gxk8U9F0nnX0FOoSV`IDi%X)bg^N$=8sYE-=cqnbtdff1 z$*}v3W>`TMeL)VaS%>w_qNWj3dD$C5!8)cCeKQ>|d_J?A$K3F(pjNKI#4v)FmC(L) zH8pNkZ$+Ht-f2OL4&GE&P(&y2-nnPgiG*$7UhACd?do6*i;Cjv*;AM{zd9J(OmVyB z)%I2}s-N8(Nj0hx_7b8IQ9X7o?E?eY#3iey;@O8vEpbIMEo9DO;B$aH8043lxJkON z;Z{~x7Vf~FAWRS;i_VzxmhI;fI8}Kam3W(zN88&cGQ!DKjT%?_O*+ zn^eDKngGd#X6ww9)qVTYmF8=F?I#{j7!03o8(e(anyWU%tIFNNl^R)1gq;jnGVoUq zQ0zZIB?XAW7WFsYbq}?V87|n+@S+&(bds+rl4$G4=)V!nDQBjWuY&AkX{Dvr51m#i zCFReLa>dY*Somr1Y}ua^HQK1~jvUydzp~Sk{!zVhg%nfN>wOt+I z2KyM5cOHJTw74o+3VIpKVByp2egx|#T)$Cd3g)-$@rTT`nS!CHa(Ib~1#K4cls zO{avbekeD?0C;l8@W$dEH7S`6E?TaXmBTJ2l4e8-UncxZmZ$9Z#Ubx%?z1fUW4< oaSCE*EMj{sVrQ(x%K0i1lU{zlm{NK5pFf@`$*IfMOTP~JUj_oq6aWAK literal 0 HcmV?d00001 diff --git a/forge-gui/res/adventure/Shandalar/ui/inn.json b/forge-gui/res/adventure/Shandalar/ui/inn.json index 9ef4fa3469e..e3f29ce23e8 100644 --- a/forge-gui/res/adventure/Shandalar/ui/inn.json +++ b/forge-gui/res/adventure/Shandalar/ui/inn.json @@ -9,32 +9,56 @@ "width": 480, "height": 270 }, + { + "type": "Image", + "image": "ui/heal.png", + "x": 60, + "y": 85, + "width": 100, + "height": 100 + }, { "type": "TextButton", "name": "heal", "text": "Heal", - "width": 48, - "height": 16, - "x": 420, - "y": 10 + "width": 100, + "height": 30, + "x": 60, + "y": 200 + }, + { + "type": "Image", + "image": "ui/sell.png", + "x": 190, + "y": 85, + "width": 100, + "height": 100 }, { "type": "TextButton", "name": "sell", "text": "Sell cards", - "width": 48, - "height": 16, - "x": 420, - "y": 34 + "width": 100, + "height": 30, + "x": 190, + "y": 200 + }, + { + "type": "Image", + "image": "ui/leave.png", + "x": 320, + "y": 85, + "width": 100, + "height": 100 }, { "type": "TextButton", "name": "done", "text": "Leave", - "width": 48, - "height": 16, - "x": 420, - "y": 58 + "width": 100, + "height": 30, + "x": 320, + "y": 200 } ] } \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/leave.png b/forge-gui/res/adventure/Shandalar/ui/leave.png new file mode 100644 index 0000000000000000000000000000000000000000..7c13521c224e3834ec60b20fd12c4cf130d10435 GIT binary patch literal 14464 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 Pe*|SE6(!2WzWDtw#Ln5b literal 0 HcmV?d00001 diff --git a/forge-gui/res/adventure/Shandalar/ui/new_game_mobile.json b/forge-gui/res/adventure/Shandalar/ui/new_game_mobile.json new file mode 100644 index 00000000000..bbc40f12a97 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/ui/new_game_mobile.json @@ -0,0 +1,163 @@ +{ + "width": 480, + "height": 270, + "yDown": true, + "elements": [ + { + "type": "Image", + "image": "ui/title_bg.png", + "width": 480, + "height": 270 + }, + { + "type": "Scroll", + "style": "paper", + "x": 56, + "y": 10, + "width": 256, + "height": 250 + }, + { + "type": "Label", + "text": "Create a Character", + "width": 128, + "height": 32, + "font": "blackbig", + "x": 104, + "y": 16 + }, + { + "type": "Label", + "text": "Avatar:", + "width": 128, + "height": 32, + "x": 104, + "y": 58 + }, + { + "type": "Label", + "text": "Name:", + "width": 128, + "height": 32, + "x": 104, + "y": 90 + }, + { + "type": "Label", + "text": "Race:", + "width": 128, + "height": 32, + "x": 104, + "y": 124 + }, + { + "type": "Label", + "text": "Gender:", + "width": 128, + "height": 32, + "x": 104, + "y": 154 + }, + { + "type": "Label", + "text": "Difficulty:", + "width": 128, + "height": 32, + "x": 104, + "y": 186 + }, + { + "type": "Label", + "text": "Deck:", + "width": 128, + "height": 32, + "x": 104, + "y": 218 + }, + { + "type": "ImageButton", + "name": "leftAvatar", + "style": "leftarrow", + "width": 16, + "height": 16, + "x": 164, + "y": 64 + }, + { + "type": "Image", + "name": "avatarPreview", + "width": 48, + "height": 48, + "x": 196, + "y": 48 + }, + { + "type": "ImageButton", + "name": "rightAvatar", + "style": "rightarrow", + "width": 16, + "height": 16, + "x": 260, + "y": 64 + }, + { + "type": "TextField", + "name": "nameField", + "align": 1, + "width": 112, + "height": 16, + "x": 164, + "y": 96 + }, + { + "type": "Selector", + "name": "race", + "width": 112, + "height": 16, + "x": 164, + "y": 128 + }, + { + "type": "Selector", + "name": "gender", + "width": 112, + "height": 16, + "x": 164, + "y": 160 + }, + { + "type": "Selector", + "name": "difficulty", + "width": 112, + "height": 16, + "x": 164, + "y": 192 + }, + { + "type": "Selector", + "name": "deck", + "width": 112, + "height": 16, + "x": 164, + "y": 224 + }, + { + "type": "TextButton", + "name": "back", + "text": "Back", + "width": 100, + "height": 30, + "x": 348, + "y": 85 + }, + { + "type": "TextButton", + "name": "start", + "text": "Start", + "width": 100, + "height": 30, + "x": 348, + "y": 155 + } + ] +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/save_load_mobile.json b/forge-gui/res/adventure/Shandalar/ui/save_load_mobile.json new file mode 100644 index 00000000000..b520787c9fd --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/ui/save_load_mobile.json @@ -0,0 +1,68 @@ +{ + "width": 480, + "height": 270, + "yDown": true, + "elements": [ + { + "type": "Image", + "image": "ui/title_bg.png", + "width": 480, + "height": 270 + }, + { + "type": "Scroll", + "name": "saveSlots", + "x": 15, + "y": 18, + "width": 332, + "height": 235 + }, + { + "type": "Image", + "image": "ui/blank.png", + "width": 96, + "height": 54, + "x": 370, + "y": 30 + }, + { + "type": "Image", + "name" : "preview_border", + "image": "ui/avatarhud.png", + "width": 96, + "height": 54, + "x": 370, + "y": 30 + }, + { + "type": "Image", + "name": "preview", + "width": 86, + "height": 48, + "x": 376, + "y": 33 + }, + { + "type": "TextButton", + "name": "return", + "text": "Back", + "width": 100, + "height": 30, + "x": 368, + "y": 125 + }, + { + "type": "TextButton", + "name": "save", + "text": "saveLoad", + "width": 100, + "height": 30, + "x": 368, + "y": 195 + }, + { + "type": "Table", + "font": "default" + } + ] +} \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/sell.png b/forge-gui/res/adventure/Shandalar/ui/sell.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb51706ea6a2bed9a5eaaa60124f4631a8781c2 GIT binary patch literal 12825 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 Date: Wed, 23 Feb 2022 21:58:37 -0500 Subject: [PATCH 15/16] spacing for $ChangeZone --- forge-gui/res/cardsfolder/a/akoum_firebird.txt | 2 +- forge-gui/res/cardsfolder/b/blood_speaker.txt | 2 +- forge-gui/res/cardsfolder/c/carrion_thrash.txt | 2 +- forge-gui/res/cardsfolder/c/charnelhoard_wurm.txt | 2 +- forge-gui/res/cardsfolder/c/crossroads_candleguide.txt | 2 +- forge-gui/res/cardsfolder/d/death_spark.txt | 2 +- forge-gui/res/cardsfolder/e/emeria_the_sky_ruin.txt | 2 +- forge-gui/res/cardsfolder/e/equilibrium.txt | 2 +- forge-gui/res/cardsfolder/g/genesis.txt | 2 +- forge-gui/res/cardsfolder/g/ghastly_remains.txt | 2 +- forge-gui/res/cardsfolder/h/hibernation_sliver.txt | 2 +- forge-gui/res/cardsfolder/i/ichorid.txt | 2 +- forge-gui/res/cardsfolder/j/junk_diver.txt | 2 +- forge-gui/res/cardsfolder/l/llanowar_sentinel.txt | 2 +- forge-gui/res/cardsfolder/m/masked_admirers.txt | 2 +- forge-gui/res/cardsfolder/m/master_of_death.txt | 2 +- forge-gui/res/cardsfolder/m/myr_retriever.txt | 2 +- forge-gui/res/cardsfolder/p/paleoloth.txt | 2 +- forge-gui/res/cardsfolder/p/punishing_fire.txt | 2 +- forge-gui/res/cardsfolder/p/pyre_zombie.txt | 2 +- forge-gui/res/cardsfolder/r/reya_dawnbringer.txt | 2 +- forge-gui/res/cardsfolder/r/rootwater_thief.txt | 2 +- forge-gui/res/cardsfolder/s/sanctum_of_ugin.txt | 2 +- forge-gui/res/cardsfolder/s/soul_guide_gryff.txt | 2 +- forge-gui/res/cardsfolder/s/sun_titan.txt | 2 +- forge-gui/res/cardsfolder/s/surgespanner.txt | 4 ++-- forge-gui/res/cardsfolder/t/taj_nar_swordsmith.txt | 2 +- forge-gui/res/cardsfolder/t/teneb_the_harvester.txt | 2 +- forge-gui/res/cardsfolder/t/tethmos_high_priest.txt | 2 +- forge-gui/res/cardsfolder/t/timely_hordemate.txt | 2 +- forge-gui/res/tokenscripts/b_1_2_bat_flying_nosferatu.txt | 2 +- 31 files changed, 32 insertions(+), 32 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/akoum_firebird.txt b/forge-gui/res/cardsfolder/a/akoum_firebird.txt index 879751c4599..d07fad223d5 100644 --- a/forge-gui/res/cardsfolder/a/akoum_firebird.txt +++ b/forge-gui/res/cardsfolder/a/akoum_firebird.txt @@ -6,7 +6,7 @@ K:Flying K:Haste K:CARDNAME attacks each combat if able. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, you may pay {4}{R}{R}. If you do, return CARDNAME from your graveyard to the battlefield. -SVar:TrigChange:AB$ChangeZone | Cost$ 4 R R | Origin$ Graveyard | Destination$ Battlefield +SVar:TrigChange:AB$ ChangeZone | Cost$ 4 R R | Origin$ Graveyard | Destination$ Battlefield SVar:SacMe:3 SVar:DiscardMe:3 Oracle:Flying, haste\nAkoum Firebird attacks each combat if able.\nLandfall — Whenever a land enters the battlefield under your control, you may pay {4}{R}{R}. If you do, return Akoum Firebird from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/b/blood_speaker.txt b/forge-gui/res/cardsfolder/b/blood_speaker.txt index 216ee836b53..c12cb57ba7d 100644 --- a/forge-gui/res/cardsfolder/b/blood_speaker.txt +++ b/forge-gui/res/cardsfolder/b/blood_speaker.txt @@ -3,7 +3,7 @@ ManaCost:3 B Types:Creature Ogre Shaman PT:3/2 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigSearch | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, you may sacrifice CARDNAME. If you do, search your library for a Demon card, reveal that card, put it into your hand, then shuffle. -SVar:TrigSearch:AB$ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Library | Destination$ Hand | ChangeType$ Demon | ChangeNum$ 1 +SVar:TrigSearch:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Library | Destination$ Hand | ChangeType$ Demon | ChangeNum$ 1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Demon.YouCtrl | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever a Demon enters the battlefield under your control, you may return CARDNAME from your graveyard to your hand. SVar:TrigReturn:DB$ ChangeZone | Defined$ Self | Origin$ Graveyard | Destination$ Hand DeckHints:Type$Demon diff --git a/forge-gui/res/cardsfolder/c/carrion_thrash.txt b/forge-gui/res/cardsfolder/c/carrion_thrash.txt index 208fc55960d..b4508dd2167 100644 --- a/forge-gui/res/cardsfolder/c/carrion_thrash.txt +++ b/forge-gui/res/cardsfolder/c/carrion_thrash.txt @@ -3,5 +3,5 @@ ManaCost:2 B R G Types:Creature Viashino Warrior PT:4/4 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | OptionalDecider$ You | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME dies, you may pay {2}. If you do, return another target creature card from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.Other | TargetsWithDefinedController$ TriggeredCardController | Cost$ 2 +SVar:TrigChange:AB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.Other | TargetsWithDefinedController$ TriggeredCardController | Cost$ 2 Oracle:When Carrion Thrash dies, you may pay {2}. If you do, return another target creature card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/c/charnelhoard_wurm.txt b/forge-gui/res/cardsfolder/c/charnelhoard_wurm.txt index de233f86f29..19c8185191e 100644 --- a/forge-gui/res/cardsfolder/c/charnelhoard_wurm.txt +++ b/forge-gui/res/cardsfolder/c/charnelhoard_wurm.txt @@ -4,5 +4,5 @@ Types:Creature Wurm PT:6/6 K:Trample T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | OptionalDecider$ You | Execute$ TrigChange | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, you may return target card from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Card.YouCtrl | Cost$ 0 +SVar:TrigChange:AB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Card.YouCtrl | Cost$ 0 Oracle:Trample\nWhenever Charnelhoard Wurm deals damage to an opponent, you may return target card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/c/crossroads_candleguide.txt b/forge-gui/res/cardsfolder/c/crossroads_candleguide.txt index a64f02b760b..1b0b6caf46e 100644 --- a/forge-gui/res/cardsfolder/c/crossroads_candleguide.txt +++ b/forge-gui/res/cardsfolder/c/crossroads_candleguide.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact Creature Scarecrow PT:3/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, exile up to one target card from a graveyard. -SVar:TrigChangeZone:DB$ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target card in a graveyard to exile +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target card in a graveyard to exile A:AB$ Mana | Cost$ 2 | Produced$ Any | SpellDescription$ Add one mana of any color. Oracle:When Crossroads Candleguide enters the battlefield, exile up to one target card from a graveyard.\n{2}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/d/death_spark.txt b/forge-gui/res/cardsfolder/d/death_spark.txt index a886a2dee80..661a11e0058 100644 --- a/forge-gui/res/cardsfolder/d/death_spark.txt +++ b/forge-gui/res/cardsfolder/d/death_spark.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Instant A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Graveyard | IsPresent$ Creature.YouOwn+DirectlyAbove | PresentZone$ Graveyard | PresentCompare$ EQ1 | Execute$ TrigReturn | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard with a creature card directly above it, you may pay {1}. If you do, return CARDNAME to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 1 | Defined$ Self | Origin$ Graveyard | Destination$ Hand +SVar:TrigReturn:AB$ ChangeZone | Cost$ 1 | Defined$ Self | Origin$ Graveyard | Destination$ Hand SVar:NeedsOrderedGraveyard:TRUE Oracle:Death Spark deals 1 damage to any target.\nAt the beginning of your upkeep, if Death Spark is in your graveyard with a creature card directly above it, you may pay {1}. If you do, return Death Spark to your hand. diff --git a/forge-gui/res/cardsfolder/e/emeria_the_sky_ruin.txt b/forge-gui/res/cardsfolder/e/emeria_the_sky_ruin.txt index 31eff212495..cce91b3f9d1 100644 --- a/forge-gui/res/cardsfolder/e/emeria_the_sky_ruin.txt +++ b/forge-gui/res/cardsfolder/e/emeria_the_sky_ruin.txt @@ -4,5 +4,5 @@ Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChange | IsPresent$ Card.Plains+YouCtrl | PresentCompare$ GE7 | TriggerDescription$ At the beginning of your upkeep, if you control seven or more Plains, you may return target creature card from your graveyard to the battlefield. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | Cost$ 0 +SVar:TrigChange:AB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | Cost$ 0 Oracle:Emeria, the Sky Ruin enters the battlefield tapped.\nAt the beginning of your upkeep, if you control seven or more Plains, you may return target creature card from your graveyard to the battlefield.\n{T}: Add {W}. diff --git a/forge-gui/res/cardsfolder/e/equilibrium.txt b/forge-gui/res/cardsfolder/e/equilibrium.txt index 00284c47c52..1d72c337973 100644 --- a/forge-gui/res/cardsfolder/e/equilibrium.txt +++ b/forge-gui/res/cardsfolder/e/equilibrium.txt @@ -2,6 +2,6 @@ Name:Equilibrium ManaCost:1 U U Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigBounce | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast a creature spell, you may pay {1}. If you do, return target creature to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. +SVar:TrigBounce:AB$ ChangeZone | Cost$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. SVar:BuffedBy:Creature Oracle:Whenever you cast a creature spell, you may pay {1}. If you do, return target creature to its owner's hand. diff --git a/forge-gui/res/cardsfolder/g/genesis.txt b/forge-gui/res/cardsfolder/g/genesis.txt index d282a94c18a..39de00dce06 100644 --- a/forge-gui/res/cardsfolder/g/genesis.txt +++ b/forge-gui/res/cardsfolder/g/genesis.txt @@ -3,6 +3,6 @@ ManaCost:4 G Types:Creature Incarnation PT:4/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard, you may pay {2}{G}. If you do, return target creature card from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Cost$ 2 G | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl +SVar:TrigChange:AB$ ChangeZone | Cost$ 2 G | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl SVar:DiscardMe:2 Oracle:At the beginning of your upkeep, if Genesis is in your graveyard, you may pay {2}{G}. If you do, return target creature card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/g/ghastly_remains.txt b/forge-gui/res/cardsfolder/g/ghastly_remains.txt index 14f680dc2bd..239849116a4 100644 --- a/forge-gui/res/cardsfolder/g/ghastly_remains.txt +++ b/forge-gui/res/cardsfolder/g/ghastly_remains.txt @@ -4,7 +4,7 @@ Types:Creature Zombie PT:0/0 K:Amplify:1:Zombie T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.StrictlySelf | PresentZone$ Graveyard | PresentPlayer$ You | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard, you may pay {B}{B}{B}. If you do, return CARDNAME to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ B B B | Defined$ Self | Origin$ Graveyard | Destination$ Hand +SVar:TrigReturn:AB$ ChangeZone | Cost$ B B B | Defined$ Self | Origin$ Graveyard | Destination$ Hand SVar:NeedsToPlayVar:X GE2 SVar:X:Count$TypeInYourHand.Zombie SVar:SacMe:2 diff --git a/forge-gui/res/cardsfolder/h/hibernation_sliver.txt b/forge-gui/res/cardsfolder/h/hibernation_sliver.txt index 2022e5b75fa..d589147c5a0 100644 --- a/forge-gui/res/cardsfolder/h/hibernation_sliver.txt +++ b/forge-gui/res/cardsfolder/h/hibernation_sliver.txt @@ -3,6 +3,6 @@ ManaCost:U B Types:Creature Sliver PT:2/2 S:Mode$ Continuous | Affected$ Sliver | AddAbility$ Bounce | Description$ All Slivers have "Pay 2 life, Return this permanent to its owner's hand." -SVar:Bounce:AB$ChangeZone | Cost$ PayLife<2> | Defined$ Self | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return this permanent to its owner's hand +SVar:Bounce:AB$ ChangeZone | Cost$ PayLife<2> | Defined$ Self | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return this permanent to its owner's hand SVar:PlayMain1:TRUE Oracle:All Slivers have "Pay 2 life: Return this permanent to its owner's hand." diff --git a/forge-gui/res/cardsfolder/i/ichorid.txt b/forge-gui/res/cardsfolder/i/ichorid.txt index 907d338bd61..8976a46043b 100644 --- a/forge-gui/res/cardsfolder/i/ichorid.txt +++ b/forge-gui/res/cardsfolder/i/ichorid.txt @@ -8,5 +8,5 @@ SVar:TrigSac:DB$ Sacrifice | SacValid$ Self SVar:EndOfTurnLeavePlay:True SVar:PlayMain1:TRUE T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | OptionalDecider$ You | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard, you may exile a black creature card other than CARDNAME from your graveyard. If you do, return CARDNAME to the battlefield. -SVar:TrigReturn:AB$ChangeZone | Cost$ ExileFromGrave<1/Creature.Black+Other> | Origin$ Graveyard | Destination$ Battlefield +SVar:TrigReturn:AB$ ChangeZone | Cost$ ExileFromGrave<1/Creature.Black+Other> | Origin$ Graveyard | Destination$ Battlefield Oracle:Haste\nAt the beginning of the end step, sacrifice Ichorid.\nAt the beginning of your upkeep, if Ichorid is in your graveyard, you may exile a black creature card other than Ichorid from your graveyard. If you do, return Ichorid to the battlefield. diff --git a/forge-gui/res/cardsfolder/j/junk_diver.txt b/forge-gui/res/cardsfolder/j/junk_diver.txt index fe173890098..8e37e7ae626 100644 --- a/forge-gui/res/cardsfolder/j/junk_diver.txt +++ b/forge-gui/res/cardsfolder/j/junk_diver.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Bird PT:1/1 K:Flying T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME dies, return another target artifact card from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Artifact.Other | TargetsWithDefinedController$ TriggeredCardController | Cost$ 0 +SVar:TrigChange:AB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Artifact.Other | TargetsWithDefinedController$ TriggeredCardController | Cost$ 0 SVar:SacMe:1 Oracle:Flying\nWhen Junk Diver dies, return another target artifact card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/l/llanowar_sentinel.txt b/forge-gui/res/cardsfolder/l/llanowar_sentinel.txt index dd00570a77a..010534bc347 100644 --- a/forge-gui/res/cardsfolder/l/llanowar_sentinel.txt +++ b/forge-gui/res/cardsfolder/l/llanowar_sentinel.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Creature Elf PT:2/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, you may pay {1}{G}. If you do, search your library for a card named CARDNAME, put that card onto the battlefield, then shuffle. -SVar:TrigChange:AB$ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Card.namedLlanowar Sentinel | ChangeNum$ 1 +SVar:TrigChange:AB$ ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Card.namedLlanowar Sentinel | ChangeNum$ 1 DeckHints:Name$Llanowar Sentinel Oracle:When Llanowar Sentinel enters the battlefield, you may pay {1}{G}. If you do, search your library for a card named Llanowar Sentinel, put that card onto the battlefield, then shuffle. diff --git a/forge-gui/res/cardsfolder/m/masked_admirers.txt b/forge-gui/res/cardsfolder/m/masked_admirers.txt index a4dbeafdc8c..a88f591a44d 100644 --- a/forge-gui/res/cardsfolder/m/masked_admirers.txt +++ b/forge-gui/res/cardsfolder/m/masked_admirers.txt @@ -5,5 +5,5 @@ PT:3/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a creature spell, you may pay {G}{G}. If you do, return CARDNAME from your graveyard to your hand. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:TrigReturn:AB$ChangeZone | Cost$ G G | Defined$ Self | Origin$ Graveyard | Destination$ Hand +SVar:TrigReturn:AB$ ChangeZone | Cost$ G G | Defined$ Self | Origin$ Graveyard | Destination$ Hand Oracle:When Masked Admirers enters the battlefield, draw a card.\nWhenever you cast a creature spell, you may pay {G}{G}. If you do, return Masked Admirers from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/m/master_of_death.txt b/forge-gui/res/cardsfolder/m/master_of_death.txt index f6845616466..46590664327 100644 --- a/forge-gui/res/cardsfolder/m/master_of_death.txt +++ b/forge-gui/res/cardsfolder/m/master_of_death.txt @@ -5,7 +5,7 @@ PT:3/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSurveil | TriggerDescription$ When CARDNAME enters the battlefield, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) SVar:TrigSurveil:DB$ Surveil | Defined$ You | Amount$ 2 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.StrictlySelf | PresentZone$ Graveyard | PresentPlayer$ You | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard, you may pay 1 life. If you do, return it to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ PayLife<1> | Defined$ Self | Origin$ Graveyard | Destination$ Hand +SVar:TrigReturn:AB$ ChangeZone | Cost$ PayLife<1> | Defined$ Self | Origin$ Graveyard | Destination$ Hand SVar:SacMe:2 SVar:DiscardMe:1 Oracle:When Master of Death enters the battlefield, surveil 2.\nAt the beginning of your upkeep, if Master of Death is in your graveyard, you may pay 1 life. If you do, return it to your hand. diff --git a/forge-gui/res/cardsfolder/m/myr_retriever.txt b/forge-gui/res/cardsfolder/m/myr_retriever.txt index a36f67ab152..2ce6a896830 100644 --- a/forge-gui/res/cardsfolder/m/myr_retriever.txt +++ b/forge-gui/res/cardsfolder/m/myr_retriever.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact Creature Myr PT:1/1 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME dies, return another target artifact card from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Artifact.Other | TargetsWithDefinedController$ TriggeredCardController | Cost$ 0 +SVar:TrigChange:AB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Artifact.Other | TargetsWithDefinedController$ TriggeredCardController | Cost$ 0 SVar:SacMe:1 Oracle:When Myr Retriever dies, return another target artifact card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/p/paleoloth.txt b/forge-gui/res/cardsfolder/p/paleoloth.txt index e4cce8d9f8f..13956ec7eb7 100644 --- a/forge-gui/res/cardsfolder/p/paleoloth.txt +++ b/forge-gui/res/cardsfolder/p/paleoloth.txt @@ -3,5 +3,5 @@ ManaCost:4 G G Types:Creature Beast PT:5/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerGE5+Other+YouCtrl | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ Whenever another creature with power 5 or greater enters the battlefield under your control, you may return target creature card from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl | Cost$ 0 +SVar:TrigChange:AB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl | Cost$ 0 Oracle:Whenever another creature with power 5 or greater enters the battlefield under your control, you may return target creature card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/p/punishing_fire.txt b/forge-gui/res/cardsfolder/p/punishing_fire.txt index 94de257b396..9e2ea73ec40 100644 --- a/forge-gui/res/cardsfolder/p/punishing_fire.txt +++ b/forge-gui/res/cardsfolder/p/punishing_fire.txt @@ -3,5 +3,5 @@ ManaCost:1 R Types:Instant A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. T:Mode$ LifeGained | ValidPlayer$ Opponent | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ Whenever an opponent gains life, you may pay {R}. If you do, return CARDNAME from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Cost$ R | Origin$ Graveyard | Destination$ Hand +SVar:TrigChange:AB$ ChangeZone | Cost$ R | Origin$ Graveyard | Destination$ Hand Oracle:Punishing Fire deals 2 damage to any target.\nWhenever an opponent gains life, you may pay {R}. If you do, return Punishing Fire from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/p/pyre_zombie.txt b/forge-gui/res/cardsfolder/p/pyre_zombie.txt index 778c27be90b..7292dfce3af 100644 --- a/forge-gui/res/cardsfolder/p/pyre_zombie.txt +++ b/forge-gui/res/cardsfolder/p/pyre_zombie.txt @@ -5,7 +5,7 @@ PT:2/1 A:AB$ DealDamage | Cost$ 1 R R Sac<1/CARDNAME> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. #The IsPresent stuff in the trigger is necessary because it must be checked on resolve as well. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.StrictlySelf | PresentZone$ Graveyard | PresentPlayer$ You | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard, you may pay {1}{B}{B}. If you do, return CARDNAME to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 1 B B | Defined$ Self | Origin$ Graveyard | Destination$ Hand +SVar:TrigReturn:AB$ ChangeZone | Cost$ 1 B B | Defined$ Self | Origin$ Graveyard | Destination$ Hand SVar:SacMe:2 SVar:DiscardMe:1 Oracle:At the beginning of your upkeep, if Pyre Zombie is in your graveyard, you may pay {1}{B}{B}. If you do, return Pyre Zombie to your hand.\n{1}{R}{R}, Sacrifice Pyre Zombie: It deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/r/reya_dawnbringer.txt b/forge-gui/res/cardsfolder/r/reya_dawnbringer.txt index e948b61f48d..729ec682704 100644 --- a/forge-gui/res/cardsfolder/r/reya_dawnbringer.txt +++ b/forge-gui/res/cardsfolder/r/reya_dawnbringer.txt @@ -4,5 +4,5 @@ Types:Legendary Creature Angel PT:4/6 K:Flying T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, you may return target creature card from your graveyard to the battlefield. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | Cost$ 0 +SVar:TrigChange:AB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | Cost$ 0 Oracle:Flying\nAt the beginning of your upkeep, you may return target creature card from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/r/rootwater_thief.txt b/forge-gui/res/cardsfolder/r/rootwater_thief.txt index 71fc5fbe1f0..9ab4dbdb1e8 100644 --- a/forge-gui/res/cardsfolder/r/rootwater_thief.txt +++ b/forge-gui/res/cardsfolder/r/rootwater_thief.txt @@ -4,5 +4,5 @@ Types:Creature Merfolk Rogue PT:1/2 A:AB$ Pump | Cost$ U | KW$ Flying | Defined$ Self | SpellDescription$ CARDNAME gains flying until end of turn. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigChangeZone | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may pay {2}. If you do, search that player's library for a card and exile it, then the player shuffles. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 2 | Origin$ Library | Destination$ Exile | DefinedPlayer$ TriggeredTarget | ChangeType$ Card | ChangeNum$ 1 | Chooser$ You | Shuffle$ True +SVar:TrigChangeZone:AB$ ChangeZone | Cost$ 2 | Origin$ Library | Destination$ Exile | DefinedPlayer$ TriggeredTarget | ChangeType$ Card | ChangeNum$ 1 | Chooser$ You | Shuffle$ True Oracle:{U}: Rootwater Thief gains flying until end of turn.\nWhenever Rootwater Thief deals combat damage to a player, you may pay {2}. If you do, search that player's library for a card and exile it, then the player shuffles. diff --git a/forge-gui/res/cardsfolder/s/sanctum_of_ugin.txt b/forge-gui/res/cardsfolder/s/sanctum_of_ugin.txt index 4d9d75b05c0..bb286a79ce9 100644 --- a/forge-gui/res/cardsfolder/s/sanctum_of_ugin.txt +++ b/forge-gui/res/cardsfolder/s/sanctum_of_ugin.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. T:Mode$ SpellCast | ValidCard$ Card.Colorless+cmcGE7 | ValidActivatingPlayer$ You | Execute$ TrigSearch | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a colorless spell with mana value 7 or greater, you may sacrifice CARDNAME. If you do, search your library for a colorless creature card, reveal it, put it into your hand, then shuffle. -SVar:TrigSearch:AB$ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Library | Destination$ Hand | ChangeType$ Creature.Colorless | ChangeNum$ 1 +SVar:TrigSearch:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Library | Destination$ Hand | ChangeType$ Creature.Colorless | ChangeNum$ 1 DeckHas:Ability$Mana.Colorless Oracle:{T}: Add {C}.\nWhenever you cast a colorless spell with mana value 7 or greater, you may sacrifice Sanctum of Ugin. If you do, search your library for a colorless creature card, reveal it, put it into your hand, then shuffle. diff --git a/forge-gui/res/cardsfolder/s/soul_guide_gryff.txt b/forge-gui/res/cardsfolder/s/soul_guide_gryff.txt index 63f0c548f0f..e2ce0d00d75 100644 --- a/forge-gui/res/cardsfolder/s/soul_guide_gryff.txt +++ b/forge-gui/res/cardsfolder/s/soul_guide_gryff.txt @@ -4,5 +4,5 @@ Types:Creature Hippogriff Spirit PT:3/4 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, exile up to one target card from a graveyard. -SVar:TrigChangeZone:DB$ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target card in a graveyard to exile +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target card in a graveyard to exile Oracle:Flying\nWhen Soul-Guide Gryff enters the battlefield, exile up to one target card from a graveyard. diff --git a/forge-gui/res/cardsfolder/s/sun_titan.txt b/forge-gui/res/cardsfolder/s/sun_titan.txt index fedfe7fa02d..d1015766903 100644 --- a/forge-gui/res/cardsfolder/s/sun_titan.txt +++ b/forge-gui/res/cardsfolder/s/sun_titan.txt @@ -5,6 +5,6 @@ PT:6/6 K:Vigilance T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, you may return target permanent card with mana value 3 or less from your graveyard to the battlefield. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChange | TriggerZones$ Battlefield | OptionalDecider$ You | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, you may return target permanent card with mana value 3 or less from your graveyard to the battlefield. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Permanent.YouCtrl+cmcLE3 | Cost$ 0 +SVar:TrigChange:AB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Permanent.YouCtrl+cmcLE3 | Cost$ 0 SVar:HasAttackEffect:TRUE Oracle:Vigilance\nWhenever Sun Titan enters the battlefield or attacks, you may return target permanent card with mana value 3 or less from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/s/surgespanner.txt b/forge-gui/res/cardsfolder/s/surgespanner.txt index e0f03c1937e..1d6ed6e11b2 100644 --- a/forge-gui/res/cardsfolder/s/surgespanner.txt +++ b/forge-gui/res/cardsfolder/s/surgespanner.txt @@ -2,6 +2,6 @@ Name:Surgespanner ManaCost:2 U U Types:Creature Merfolk Wizard PT:2/2 -T:Mode$ Taps | ValidCard$ Card.Self | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ Whenever Surgespanner becomes tapped, you may pay {1}{U}. If you do, return target permanent to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 1 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand +T:Mode$ Taps | ValidCard$ Card.Self | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ Whenever CARDNAME becomes tapped, you may pay {1}{U}. If you do, return target permanent to its owner's hand. +SVar:TrigBounce:AB$ ChangeZone | Cost$ 1 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand Oracle:Whenever Surgespanner becomes tapped, you may pay {1}{U}. If you do, return target permanent to its owner's hand. diff --git a/forge-gui/res/cardsfolder/t/taj_nar_swordsmith.txt b/forge-gui/res/cardsfolder/t/taj_nar_swordsmith.txt index 96c9f85ea3e..01a14a73d04 100644 --- a/forge-gui/res/cardsfolder/t/taj_nar_swordsmith.txt +++ b/forge-gui/res/cardsfolder/t/taj_nar_swordsmith.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Creature Cat Soldier PT:2/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may pay {X}. If you do, search your library for an Equipment card with mana value X or less, put that card onto the battlefield, then shuffle. -SVar:TrigChange:AB$ChangeZone | Cost$ X | Origin$ Library | Destination$ Battlefield | ChangeType$ Card.Equipment+cmcLEX | ChangeNum$ 1 +SVar:TrigChange:AB$ ChangeZone | Cost$ X | Origin$ Library | Destination$ Battlefield | ChangeType$ Card.Equipment+cmcLEX | ChangeNum$ 1 SVar:X:Count$xPaid Oracle:When Taj-Nar Swordsmith enters the battlefield, you may pay {X}. If you do, search your library for an Equipment card with mana value X or less, put that card onto the battlefield, then shuffle. diff --git a/forge-gui/res/cardsfolder/t/teneb_the_harvester.txt b/forge-gui/res/cardsfolder/t/teneb_the_harvester.txt index c79bb1c1cb7..b2af01451fc 100644 --- a/forge-gui/res/cardsfolder/t/teneb_the_harvester.txt +++ b/forge-gui/res/cardsfolder/t/teneb_the_harvester.txt @@ -4,5 +4,5 @@ Types:Legendary Creature Dragon PT:6/6 K:Flying T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may pay {2}{B}. If you do, put target creature card from a graveyard onto the battlefield under your control. -SVar:TrigChange:AB$ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | ChangeNum$ 1 | TgtPrompt$ Select target creature card in a graveyard | ValidTgts$ Creature +SVar:TrigChange:AB$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | ChangeNum$ 1 | TgtPrompt$ Select target creature card in a graveyard | ValidTgts$ Creature Oracle:Flying\nWhenever Teneb, the Harvester deals combat damage to a player, you may pay {2}{B}. If you do, put target creature card from a graveyard onto the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/t/tethmos_high_priest.txt b/forge-gui/res/cardsfolder/t/tethmos_high_priest.txt index 6ee2488e057..2da3ea01960 100644 --- a/forge-gui/res/cardsfolder/t/tethmos_high_priest.txt +++ b/forge-gui/res/cardsfolder/t/tethmos_high_priest.txt @@ -3,5 +3,5 @@ ManaCost:2 W Types:Creature Cat Cleric PT:2/3 T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ Heroic — Whenever you cast a spell that targets CARDNAME, return target creature card with mana value 2 or less from your graveyard to the battlefield. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouOwn+cmcLE2 | Cost$ 0 +SVar:TrigChange:AB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouOwn+cmcLE2 | Cost$ 0 Oracle:Heroic — Whenever you cast a spell that targets Tethmos High Priest, return target creature card with mana value 2 or less from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/t/timely_hordemate.txt b/forge-gui/res/cardsfolder/t/timely_hordemate.txt index 47adb20a6a1..917c71ef510 100644 --- a/forge-gui/res/cardsfolder/t/timely_hordemate.txt +++ b/forge-gui/res/cardsfolder/t/timely_hordemate.txt @@ -4,5 +4,5 @@ Types:Creature Human Warrior PT:3/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ RaidTest | Execute$ TrigChange | TriggerDescription$ Raid — When CARDNAME enters the battlefield, if you attacked this turn, return target creature card with mana value 2 or less from your graveyard to the battlefield. SVar:RaidTest:Count$AttackersDeclared -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl+cmcLE2 | Cost$ 0 +SVar:TrigChange:AB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl+cmcLE2 | Cost$ 0 Oracle:Raid — When Timely Hordemate enters the battlefield, if you attacked this turn, return target creature card with mana value 2 or less from your graveyard to the battlefield. diff --git a/forge-gui/res/tokenscripts/b_1_2_bat_flying_nosferatu.txt b/forge-gui/res/tokenscripts/b_1_2_bat_flying_nosferatu.txt index eef38983faf..fb9b5950fd0 100644 --- a/forge-gui/res/tokenscripts/b_1_2_bat_flying_nosferatu.txt +++ b/forge-gui/res/tokenscripts/b_1_2_bat_flying_nosferatu.txt @@ -4,5 +4,5 @@ Types:Creature Bat Colors:black PT:1/2 K:Flying -A:AB$ChangeZone | Cost$ 1 B Sac<1/CARDNAME> | ChangeType$ Card.namedSengir Nosferatu | ChangeNum$ 1 | Origin$ Exile | Destination$ Battlefield | Hidden$ True | SpellDescription$ Return an exiled card named Sengir Nosferatu to the battlefield under its owner's control +A:AB$ ChangeZone | Cost$ 1 B Sac<1/CARDNAME> | ChangeType$ Card.namedSengir Nosferatu | ChangeNum$ 1 | Origin$ Exile | Destination$ Battlefield | Hidden$ True | SpellDescription$ Return an exiled card named Sengir Nosferatu to the battlefield under its owner's control Oracle:Flying\n{1}{B}, Sacrifice this creature: Return an exiled card named Sengir Nosferatu to the battlefield under its owner's control. From f1b2c1158f8ad146619b0ab51bff36b3f4d4e595 Mon Sep 17 00:00:00 2001 From: Churrufli Date: Thu, 24 Feb 2022 07:32:57 +0100 Subject: [PATCH 16/16] Net Decks Archive Updates --- .../res/lists/net-decks-archive-block.txt | 1 + .../res/lists/net-decks-archive-legacy.txt | 32 +++++++++++++++ .../res/lists/net-decks-archive-modern.txt | 39 +++++++++++++++++++ .../res/lists/net-decks-archive-pauper.txt | 18 ++++++++- .../res/lists/net-decks-archive-pioneer.txt | 35 +++++++++++++++++ .../res/lists/net-decks-archive-standard.txt | 18 +++++++++ .../res/lists/net-decks-archive-vintage.txt | 20 ++++++++++ 7 files changed, 162 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/lists/net-decks-archive-block.txt b/forge-gui/res/lists/net-decks-archive-block.txt index b63d8da2752..3f467d65683 100644 --- a/forge-gui/res/lists/net-decks-archive-block.txt +++ b/forge-gui/res/lists/net-decks-archive-block.txt @@ -986,3 +986,4 @@ 2022-01-09 Sealed Mh2 Block Mocs (8 decks) | https://downloads.cardforge.org/decks/archive/block/2022-01-09-sealed-mh2-block-mocs.zip 2022-01-10 Sealed Mh2 Block Mocs (8 decks) | https://downloads.cardforge.org/decks/archive/block/2022-01-10-sealed-mh2-block-mocs.zip 2022-01-17 Sealed Vow Block Super Qualifier (8 decks) | https://downloads.cardforge.org/decks/archive/block/2022-01-17-sealed-vow-block-super-qualifier.zip +2022-02-20 Sealed Neo Block Super Qualifier (8 decks) | https://downloads.cardforge.org/decks/archive/block/2022-02-20-sealed-neo-block-super-qualifier.zip diff --git a/forge-gui/res/lists/net-decks-archive-legacy.txt b/forge-gui/res/lists/net-decks-archive-legacy.txt index 4ef7b997153..e9b6c4010d4 100644 --- a/forge-gui/res/lists/net-decks-archive-legacy.txt +++ b/forge-gui/res/lists/net-decks-archive-legacy.txt @@ -2214,3 +2214,35 @@ 2022-01-24 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-01-24-legacy-challenge.zip 2022-01-25 Legacy Preliminary (3 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-01-25-legacy-preliminary.zip 2022-01-26 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-01-26-legacy-preliminary.zip +2022-01-28 Legacy Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-01-28-legacy-preliminary.zip +2022-01-29 Legacy League (50 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-01-29-legacy-league.zip +2022-01-29 Legacy Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-01-29-legacy-preliminary.zip +2022-01-31 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-01-31-legacy-challenge.zip +2022-01-31 Legacy Showcase Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-01-31-legacy-showcase-challenge.zip +2022-02-01 Legacy Preliminary (9 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-01-legacy-preliminary.zip +2022-02-02 Legacy Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-02-legacy-preliminary.zip +2022-02-03 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-03-legacy-preliminary.zip +2022-02-04 Legacy Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-04-legacy-preliminary.zip +2022-02-05 Legacy League (64 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-05-legacy-league.zip +2022-02-05 Legacy Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-05-legacy-preliminary.zip +2022-02-06 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-06-legacy-challenge.zip +2022-02-06 Legacy Super Qualifier (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-06-legacy-super-qualifier.zip +2022-02-07 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-07-legacy-challenge.zip +2022-02-08 0 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-08-0-legacy-challenge.zip +2022-02-08 1 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-08-1-legacy-challenge.zip +2022-02-08 2 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-08-2-legacy-challenge.zip +2022-02-08 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-08-legacy-challenge.zip +2022-02-08 Legacy Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-08-legacy-preliminary.zip +2022-02-09 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-09-legacy-preliminary.zip +2022-02-10 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-10-legacy-preliminary.zip +2022-02-12 Legacy League (21 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-12-legacy-league.zip +2022-02-12 Legacy Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-12-legacy-preliminary.zip +2022-02-13 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-13-legacy-challenge.zip +2022-02-14 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-14-legacy-challenge.zip +2022-02-15 Legacy Preliminary (3 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-15-legacy-preliminary.zip +2022-02-18 Legacy Preliminary (3 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-18-legacy-preliminary.zip +2022-02-19 Legacy League (55 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-19-legacy-league.zip +2022-02-19 Legacy Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-19-legacy-preliminary.zip +2022-02-20 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-20-legacy-challenge.zip +2022-02-21 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-21-legacy-challenge.zip +2022-02-22 Legacy Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/legacy/2022-02-22-legacy-preliminary.zip diff --git a/forge-gui/res/lists/net-decks-archive-modern.txt b/forge-gui/res/lists/net-decks-archive-modern.txt index 08203c89a69..430451c6b99 100644 --- a/forge-gui/res/lists/net-decks-archive-modern.txt +++ b/forge-gui/res/lists/net-decks-archive-modern.txt @@ -2933,3 +2933,42 @@ 2022-01-25 Modern League (70 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-01-25-modern-league.zip 2022-01-25 Modern Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-01-25-modern-preliminary.zip 2022-01-26 Modern Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-01-26-modern-preliminary.zip +2022-01-27 Modern Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-01-27-modern-preliminary.zip +2022-01-28 Modern League (59 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-01-28-modern-league.zip +2022-01-28 Modern Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-01-28-modern-preliminary.zip +2022-01-29 Modern Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-01-29-modern-preliminary.zip +2022-01-31 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-01-31-modern-challenge.zip +2022-02-01 Modern League (73 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-01-modern-league.zip +2022-02-01 Modern Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-01-modern-preliminary.zip +2022-02-02 Modern Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-02-modern-preliminary.zip +2022-02-03 Modern Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-03-modern-preliminary.zip +2022-02-04 Modern League (65 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-04-modern-league.zip +2022-02-04 Modern Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-04-modern-preliminary.zip +2022-02-05 Modern Preliminary (9 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-05-modern-preliminary.zip +2022-02-06 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-06-modern-challenge.zip +2022-02-07 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-07-modern-challenge.zip +2022-02-08 0 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-08-0-modern-challenge.zip +2022-02-08 1 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-08-1-modern-challenge.zip +2022-02-08 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-08-modern-challenge.zip +2022-02-08 Modern League (74 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-08-modern-league.zip +2022-02-08 Modern Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-08-modern-preliminary.zip +2022-02-09 Modern Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-09-modern-preliminary.zip +2022-02-10 Modern Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-10-modern-preliminary.zip +2022-02-11 Modern League (25 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-11-modern-league.zip +2022-02-11 Modern Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-11-modern-preliminary.zip +2022-02-12 Modern Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-12-modern-preliminary.zip +2022-02-13 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-13-modern-challenge.zip +2022-02-14 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-14-modern-challenge.zip +2022-02-14 Modern Premier (16 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-14-modern-premier.zip +2022-02-15 Modern League (72 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-15-modern-league.zip +2022-02-15 Modern Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-15-modern-preliminary.zip +2022-02-16 Modern Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-16-modern-preliminary.zip +2022-02-17 Modern Preliminary (10 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-17-modern-preliminary.zip +2022-02-18 Modern League (54 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-18-modern-league.zip +2022-02-18 Modern Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-18-modern-preliminary.zip +2022-02-19 Modern Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-19-modern-preliminary.zip +2022-02-20 Modern Showcase Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-20-modern-showcase-challenge.zip +2022-02-21 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-21-modern-challenge.zip +2022-02-22 Modern League (76 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-22-modern-league.zip +2022-02-22 Modern Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-22-modern-preliminary.zip +2022-02-23 Modern Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/modern/2022-02-23-modern-preliminary.zip diff --git a/forge-gui/res/lists/net-decks-archive-pauper.txt b/forge-gui/res/lists/net-decks-archive-pauper.txt index ceb5373b962..ae4dd82fae6 100644 --- a/forge-gui/res/lists/net-decks-archive-pauper.txt +++ b/forge-gui/res/lists/net-decks-archive-pauper.txt @@ -1866,4 +1866,20 @@ 2022-01-23 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-01-23-pauper-challenge.zip 2022-01-24 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-01-24-pauper-challenge.zip 2022-01-26 Pauper League (40 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-01-26-pauper-league.zip -2022-01-26 Pauper Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-01-26-pauper-preliminary.zip \ No newline at end of file +2022-01-26 Pauper Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-01-26-pauper-preliminary.zip +2022-01-29 Pauper Super Qualifier (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-01-29-pauper-super-qualifier.zip +2022-01-31 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-01-31-pauper-challenge.zip +2022-02-02 Pauper League (47 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-02-02-pauper-league.zip +2022-02-06 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-02-06-pauper-challenge.zip +2022-02-07 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-02-07-pauper-challenge.zip +2022-02-08 0 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-02-08-0-pauper-challenge.zip +2022-02-08 1 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-02-08-1-pauper-challenge.zip +2022-02-08 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-02-08-pauper-challenge.zip +2022-02-09 Pauper League (38 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-02-09-pauper-league.zip +2022-02-13 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-02-13-pauper-challenge.zip +2022-02-14 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-02-14-pauper-challenge.zip +2022-02-16 Pauper League (30 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-02-16-pauper-league.zip +2022-02-20 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-02-20-pauper-challenge.zip +2022-02-21 Pauper Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-02-21-pauper-challenge.zip +2022-02-23 Pauper League (34 decks) | https://downloads.cardforge.org/decks/archive/pauper/2022-02-23-pauper-league.zip +Pauper League (20 decks) | https://downloads.cardforge.org/decks/archive/pauper/pauper-league.zip diff --git a/forge-gui/res/lists/net-decks-archive-pioneer.txt b/forge-gui/res/lists/net-decks-archive-pioneer.txt index e165bd9cf6d..ee3919c3caa 100644 --- a/forge-gui/res/lists/net-decks-archive-pioneer.txt +++ b/forge-gui/res/lists/net-decks-archive-pioneer.txt @@ -866,3 +866,38 @@ 2022-01-24 Pioneer Showcase Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-01-24-pioneer-showcase-challenge.zip 2022-01-25 Pioneer Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-01-25-pioneer-preliminary.zip 2022-01-26 Pioneer Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-01-26-pioneer-preliminary.zip +2022-01-27 Pioneer League (20 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-01-27-pioneer-league.zip +2022-01-27 Pioneer Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-01-27-pioneer-preliminary.zip +2022-01-28 Pioneer Preliminary (3 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-01-28-pioneer-preliminary.zip +2022-01-29 Pioneer Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-01-29-pioneer-preliminary.zip +2022-01-31 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-01-31-pioneer-challenge.zip +2022-01-31 Pioneer League (27 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-01-31-pioneer-league.zip +2022-02-03 Pioneer League (29 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-03-pioneer-league.zip +2022-02-03 Pioneer Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-03-pioneer-preliminary.zip +2022-02-04 Pioneer Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-04-pioneer-preliminary.zip +2022-02-05 Pioneer Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-05-pioneer-preliminary.zip +2022-02-06 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-06-pioneer-challenge.zip +2022-02-07 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-07-pioneer-challenge.zip +2022-02-07 Pioneer League (26 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-07-pioneer-league.zip +2022-02-08 0 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-08-0-pioneer-challenge.zip +2022-02-08 1 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-08-1-pioneer-challenge.zip +2022-02-08 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-08-pioneer-challenge.zip +2022-02-08 Pioneer Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-08-pioneer-preliminary.zip +2022-02-09 Pioneer Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-09-pioneer-preliminary.zip +2022-02-10 Pioneer League (27 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-10-pioneer-league.zip +2022-02-11 Pioneer Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-11-pioneer-preliminary.zip +2022-02-12 Pioneer Preliminary (11 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-12-pioneer-preliminary.zip +2022-02-13 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-13-pioneer-challenge.zip +2022-02-13 Pioneer Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-13-pioneer-preliminary.zip +2022-02-13 Pioneer Premier (16 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-13-pioneer-premier.zip +2022-02-14 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-14-pioneer-challenge.zip +2022-02-14 Pioneer League (36 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-14-pioneer-league.zip +2022-02-15 Pioneer Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-15-pioneer-preliminary.zip +2022-02-17 Pioneer League (23 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-17-pioneer-league.zip +2022-02-17 Pioneer Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-17-pioneer-preliminary.zip +2022-02-18 Pioneer Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-18-pioneer-preliminary.zip +2022-02-19 Pioneer Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-19-pioneer-preliminary.zip +2022-02-20 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-20-pioneer-challenge.zip +2022-02-21 Pioneer League (26 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-21-pioneer-league.zip +2022-02-21 Pioneer Showcase Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-21-pioneer-showcase-challenge.zip +2022-02-22 Pioneer Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2022-02-22-pioneer-preliminary.zip diff --git a/forge-gui/res/lists/net-decks-archive-standard.txt b/forge-gui/res/lists/net-decks-archive-standard.txt index e9baa79600c..d67b55b81f1 100644 --- a/forge-gui/res/lists/net-decks-archive-standard.txt +++ b/forge-gui/res/lists/net-decks-archive-standard.txt @@ -2575,3 +2575,21 @@ 2022-01-23 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-01-23-standard-challenge.zip 2022-01-24 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-01-24-standard-challenge.zip 2022-01-24 Standard League (11 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-01-24-standard-league.zip +2022-01-27 Standard League (14 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-01-27-standard-league.zip +2022-01-31 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-01-31-standard-challenge.zip +2022-01-31 Standard League (11 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-01-31-standard-league.zip +2022-02-03 Standard League (9 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-02-03-standard-league.zip +2022-02-06 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-02-06-standard-challenge.zip +2022-02-07 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-02-07-standard-challenge.zip +2022-02-07 Standard League (12 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-02-07-standard-league.zip +2022-02-08 0 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-02-08-0-standard-challenge.zip +2022-02-08 1 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-02-08-1-standard-challenge.zip +2022-02-08 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-02-08-standard-challenge.zip +2022-02-10 Standard League (8 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-02-10-standard-league.zip +2022-02-13 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-02-13-standard-challenge.zip +2022-02-14 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-02-14-standard-challenge.zip +2022-02-14 Standard League (18 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-02-14-standard-league.zip +2022-02-17 Standard League (14 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-02-17-standard-league.zip +2022-02-20 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-02-20-standard-challenge.zip +2022-02-21 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-02-21-standard-challenge.zip +2022-02-21 Standard League (14 decks) | https://downloads.cardforge.org/decks/archive/standard/2022-02-21-standard-league.zip diff --git a/forge-gui/res/lists/net-decks-archive-vintage.txt b/forge-gui/res/lists/net-decks-archive-vintage.txt index 1499703d2d3..fb034df00f1 100644 --- a/forge-gui/res/lists/net-decks-archive-vintage.txt +++ b/forge-gui/res/lists/net-decks-archive-vintage.txt @@ -1603,3 +1603,23 @@ 2022-01-23 Vintage League (10 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-01-23-vintage-league.zip 2022-01-24 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-01-24-vintage-challenge.zip 2022-01-24 Vintage Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-01-24-vintage-preliminary.zip +2022-01-27 Vintage Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-01-27-vintage-preliminary.zip +2022-01-29 Vintage Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-01-29-vintage-preliminary.zip +2022-01-30 Vintage League (17 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-01-30-vintage-league.zip +2022-01-31 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-01-31-vintage-challenge.zip +2022-02-03 Vintage Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-03-vintage-preliminary.zip +2022-02-05 Vintage Preliminary (3 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-05-vintage-preliminary.zip +2022-02-06 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-06-vintage-challenge.zip +2022-02-06 Vintage League (17 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-06-vintage-league.zip +2022-02-07 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-07-vintage-challenge.zip +2022-02-07 Vintage Super Qualifier (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-07-vintage-super-qualifier.zip +2022-02-08 0 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-08-0-vintage-challenge.zip +2022-02-08 1 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-08-1-vintage-challenge.zip +2022-02-08 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-08-vintage-challenge.zip +2022-02-13 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-13-vintage-challenge.zip +2022-02-13 Vintage League (11 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-13-vintage-league.zip +2022-02-14 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-14-vintage-challenge.zip +2022-02-19 Vintage Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-19-vintage-preliminary.zip +2022-02-20 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-20-vintage-challenge.zip +2022-02-20 Vintage League (19 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-20-vintage-league.zip +2022-02-21 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2022-02-21-vintage-challenge.zip