From 4e8e77924a0a1c91d08a7b0e99fc278250d2f17e Mon Sep 17 00:00:00 2001 From: friarsol Date: Thu, 19 Mar 2020 23:24:48 -0400 Subject: [PATCH 01/26] Update EditionTracking for new Edition file things --- forge-gui/tools/EditionTracking.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/forge-gui/tools/EditionTracking.py b/forge-gui/tools/EditionTracking.py index b6cc10d5884..f4d9677ceef 100644 --- a/forge-gui/tools/EditionTracking.py +++ b/forge-gui/tools/EditionTracking.py @@ -46,8 +46,11 @@ def initializeEditions(): metadata = True continue + if line.startswith("#"): + continue + if line: - hasSetNumbers = line.split(" ", 1)[0].isdigit() + hasSetNumbers = line[0].isdigit() card = line.split(" ", 2 if hasSetNumbers else 1)[-1].rstrip() if card not in mtgDataCards: From 7fb34b488710f0a64a3eb95e1ff6cdb9529e8410 Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Fri, 20 Mar 2020 19:11:59 +0000 Subject: [PATCH 02/26] MTGA Historic Format --- .../src/main/java/forge/StaticData.java | 2 +- .../src/main/java/forge/game/GameFormat.java | 2 +- .../res/editions/Historic Anthology 1.txt | 27 ++++++++++++++++ .../res/editions/Historic Anthology 2.txt | 32 +++++++++++++++++++ forge-gui/res/formats/Digital/Historic.txt | 8 +++++ 5 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/editions/Historic Anthology 1.txt create mode 100644 forge-gui/res/editions/Historic Anthology 2.txt create mode 100644 forge-gui/res/formats/Digital/Historic.txt diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index 6b65424daab..a35b3887935 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -215,7 +215,7 @@ public class StaticData { public Predicate getStandardPredicate() { return standardPredicate; } public Predicate getPioneerPredicate() { return pioneerPredicate; } - + public Predicate getModernPredicate() { return modernPredicate; } public Predicate getCommanderPredicate() { return commanderPredicate; } diff --git a/forge-game/src/main/java/forge/game/GameFormat.java b/forge-game/src/main/java/forge/game/GameFormat.java index e4efda21fb6..a66395ce300 100644 --- a/forge-game/src/main/java/forge/game/GameFormat.java +++ b/forge-game/src/main/java/forge/game/GameFormat.java @@ -47,7 +47,7 @@ import java.util.Map.Entry; public class GameFormat implements Comparable { private final String name; public enum FormatType {Sanctioned, Casual, Historic, Digital, Custom} - public enum FormatSubType {Block, Standard, Extended, Pioneer, Modern, Legacy, Vintage, Commander, Planechase, Videogame, MTGO, Custom} + public enum FormatSubType {Block, Standard, Extended, Pioneer, Modern, Legacy, Vintage, Commander, Planechase, Videogame, MTGO, Arena, Custom} // contains allowed sets, when empty allows all sets private FormatType formatType; diff --git a/forge-gui/res/editions/Historic Anthology 1.txt b/forge-gui/res/editions/Historic Anthology 1.txt new file mode 100644 index 00000000000..66d29db7ce2 --- /dev/null +++ b/forge-gui/res/editions/Historic Anthology 1.txt @@ -0,0 +1,27 @@ +[metadata] +Code=HA1 +Date=2019-11-21 +Name=Historic Anthology 1 +Type=Other + +[cards] +1 R Serra Ascendant +2 C Soul Warden +3 R Kinsbaile Cavalier +4 C Treasure Hunt +5 C Distant Melody +6 R Cryptbreaker +7 R Hypnotic Specter +8 R Phyrexian Arena +9 C Tendrils of Corruption +10 C Kiln Fiend +11 U Goblin Matron +12 R Hidetsugu's Second Rite +13 C Elvish Visionary +14 R Fauna Shaman +15 U Imperious Perfect +16 U Burning-Tree Emissary +17 R Captain Sisay +18 U Ornithopter +19 C Mind Stone +20 R Darksteel Reactor \ No newline at end of file diff --git a/forge-gui/res/editions/Historic Anthology 2.txt b/forge-gui/res/editions/Historic Anthology 2.txt new file mode 100644 index 00000000000..b1634ff631b --- /dev/null +++ b/forge-gui/res/editions/Historic Anthology 2.txt @@ -0,0 +1,32 @@ +[metadata] +Code=HA2 +Date=2020-03-12 +Name=Historic Anthology 2 +Type=Other + +[cards] +1 U Nyx-Fleece Ram +2 R Ranger of Eos +3 R Sigil of the Empty Throne +4 R Thalia, Guardian of Thraben +5 U Merrow Reejerey +6 R Inexorable Tide +7 U Brain Maggot +8 R Pack Rat +9 U Virulent Plague +10 R Waste Not +11 M Dragonmaster Outcast +12 U Goblin Ruinblaster +13 C Ancestral Mask +14 R Terravore +15 R Knight of the Reliquary +16 R Maelstrom Pulse +17 R Meddling Mage +18 M Platinum Angel +19 C Barren Moor +20 C Bojuka Bog +21 C Forgotten Cave +22 U Ghost Quarter +23 C Lonely Sandbar +24 C Secluded Steppe +25 C Tranquil Thicket \ No newline at end of file diff --git a/forge-gui/res/formats/Digital/Historic.txt b/forge-gui/res/formats/Digital/Historic.txt new file mode 100644 index 00000000000..0a1157f164f --- /dev/null +++ b/forge-gui/res/formats/Digital/Historic.txt @@ -0,0 +1,8 @@ +[format] +Name:Historic +Type:Digital +Subtype:Arena +Effective:2019-11-21 +Order:142 +Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2 +Banned:Oko, Thief of Crowns; Once Upon a Time; Veil of Summer \ No newline at end of file From 1c3e8c32b9c72472e9dd3f9606ecc11ca0749c7e Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Sun, 22 Mar 2020 04:06:19 +0000 Subject: [PATCH 03/26] Tidying BFZ rare Landfall creature cycle --- forge-gui/res/cardsfolder/a/akoum_hellkite.txt | 2 +- forge-gui/res/cardsfolder/e/emeria_shepherd.txt | 11 ++++------- forge-gui/res/cardsfolder/g/guul_draz_overseer.txt | 9 ++++----- forge-gui/res/cardsfolder/o/oran_rief_hydra.txt | 2 +- 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/akoum_hellkite.txt b/forge-gui/res/cardsfolder/a/akoum_hellkite.txt index d887365b3ba..e2fc4cd5a10 100644 --- a/forge-gui/res/cardsfolder/a/akoum_hellkite.txt +++ b/forge-gui/res/cardsfolder/a/akoum_hellkite.txt @@ -6,5 +6,5 @@ K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, CARDNAME deals 1 damage to any target. If that land was a mountain, CARDNAME deals 2 damage to that permanent or player instead. SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | TgtPrompt$ Select any target | NumDmg$ X | References$ X SVar:X:TriggeredCard$Valid Mountain/Plus.1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/akoum_hellkite.jpg +SVar:BuffedBy:Land Oracle:Flying\nLandfall — Whenever a land enters the battlefield under your control, Akoum Hellkite deals 1 damage to any target. If that land is a Mountain, Akoum Hellkite deals 2 damage to that permanent or player instead. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/e/emeria_shepherd.txt b/forge-gui/res/cardsfolder/e/emeria_shepherd.txt index 89129e43ec4..f32ecec2d36 100644 --- a/forge-gui/res/cardsfolder/e/emeria_shepherd.txt +++ b/forge-gui/res/cardsfolder/e/emeria_shepherd.txt @@ -3,11 +3,8 @@ ManaCost:5 W W Types:Creature Angel PT:4/4 K:Flying -T:Mode$ ChangesZone | TriggerZones$ Battlefield | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl+HasSubtype Plains | Execute$ DBChoose | OptionalDecider$ You | TriggerDescription$ Landfall — Whenever a land enters the battlefield, you may return target nonland permanent card from your graveyard to your hand. If that land is a Plains, you may return that nonland permanent card to the battlefield instead. -T:Mode$ ChangesZone | TriggerZones$ Battlefield | Secondary$ True | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl+HasNoSubtype Plains | Execute$ TrigChangeHand | OptionalDecider$ You | TriggerDescription$ Landfall — Whenever a land enters the battlefield, you may return target nonland permanent card from your graveyard to your hand. -SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Permanent.YouCtrl+nonLand | ChoiceZone$ Graveyard | SubAbility$ TrigChangeHand2 -SVar:TrigChangeHand:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Permanent.YouCtrl+nonLand | Defined$ ChosenCard -SVar:TrigChangeHand2:DB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | DestinationAlternative$ Hand | AlternativeDestinationMessage$ Would you like to return this permanent to the battlefield (and not to the hand)? | Defined$ ChosenCard | ConditionCheckSVar$ NumTargets | ConditionSVarCompare$ GE1 | References$ NumTargets -SVar:NumTargets:Count$ValidGraveyard Permanent.YouCtrl+nonLand -SVar:Picture:http://www.wizards.com/global/images/magic/general/emeria_shepherd.jpg +T:Mode$ ChangesZone | TriggerZones$ Battlefield | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | Execute$ TrigChangeHand | OptionalDecider$ You | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, you may return target nonland permanent card from your graveyard to your hand. If that land is a Plains, you may return that nonland permanent card to the battlefield instead. +SVar:TrigChangeHand:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target nonland permanent | ValidTgts$ Permanent.YouCtrl+nonLand | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Plains | ConditionCompare$ EQ0 | SubAbility$ TrigChangeBattlefield +SVar:TrigChangeBattlefield:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | DestinationAlternative$ Hand | AlternativeDestinationMessage$ Would you like to return this permanent to the battlefield (and not to your hand)? | Defined$ Targeted | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Plains | ConditionCompare$ EQ1 +SVar:BuffedBy:Land Oracle:Flying\nLandfall — Whenever a land enters the battlefield under your control, you may return target nonland permanent card from your graveyard to your hand. If that land is a Plains, you may return that nonland permanent card to the battlefield instead. diff --git a/forge-gui/res/cardsfolder/g/guul_draz_overseer.txt b/forge-gui/res/cardsfolder/g/guul_draz_overseer.txt index 224a6c64e01..50e6d91c9eb 100644 --- a/forge-gui/res/cardsfolder/g/guul_draz_overseer.txt +++ b/forge-gui/res/cardsfolder/g/guul_draz_overseer.txt @@ -3,9 +3,8 @@ ManaCost:4 B B Types:Creature Vampire PT:3/4 K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl+HasSubtype Swamp | TriggerZones$ Battlefield | Execute$ TrigPumpAll2 | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, other creatures you control get +1/+0 until end of turn. If that land is a Swamp, those creatures get +2/+0 until end of turn instead. -T:Mode$ ChangesZone | Secondary$ True | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl+HasNoSubtype Swamp | TriggerZones$ Battlefield | Execute$ TrigPumpAll | TriggerDescription$ Landfall — Whenever a land enters the battlefield, other creatures you control get +1/+0 until end of turn. -SVar:TrigPumpAll:DB$PumpAll | ValidCards$ Creature.Other+YouCtrl | NumAtt$ 1 -SVar:TrigPumpAll2:DB$PumpAll | ValidCards$ Creature.Other+YouCtrl | NumAtt$ 2 -SVar:Picture:http://www.wizards.com/global/images/magic/general/guul_draz_overseer.jpg +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPumpAll | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, other creatures you control get +1/+0 until end of turn. If that land is a Swamp, those creatures get +2/+0 until end of turn instead. +SVar:TrigPumpAll:DB$PumpAll | ValidCards$ Creature.Other+YouCtrl | NumAtt$ X | References$ X +SVar:X:TriggeredCard$Valid Swamp/Plus.1 +SVar:BuffedBy:Land Oracle:Flying\nLandfall — Whenever a land enters the battlefield under your control, other creatures you control get +1/+0 until end of turn. If that land is a Swamp, those creatures get +2/+0 until end of turn instead. diff --git a/forge-gui/res/cardsfolder/o/oran_rief_hydra.txt b/forge-gui/res/cardsfolder/o/oran_rief_hydra.txt index 22e4daedd22..169ce64cb19 100644 --- a/forge-gui/res/cardsfolder/o/oran_rief_hydra.txt +++ b/forge-gui/res/cardsfolder/o/oran_rief_hydra.txt @@ -6,5 +6,5 @@ K:Trample T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on CARDNAME. If that land is a Forest, put two +1/+1 counters on CARDNAME instead. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | References$ X SVar:X:TriggeredCard$Valid Forest/Plus.1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/oran_rief_hydra.jpg +SVar:BuffedBy:Land Oracle:Trample\nLandfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on Oran-Rief Hydra. If that land is a Forest, put two +1/+1 counters on Oran-Rief Hydra instead. \ No newline at end of file From 27a6f9c3a4fcf8de496121cc746a223dad1166ad Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 22 Mar 2020 11:02:04 +0300 Subject: [PATCH 04/26] - Preparing Forge for Android publish v1.6.33.001 [incremental] --- forge-gui-android/pom.xml | 2 +- forge-gui-ios/pom.xml | 2 +- forge-gui-mobile/src/forge/Forge.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 854f9159678..3067cde2874 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.32.001 + 1.6.33.001 keystore alias storepass diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index eee4ce43c2f..a36586a1536 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx2048m - 1.6.32.001 + 1.6.33.001 diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 0b1121707a0..9c300860bae 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -42,7 +42,7 @@ import java.util.List; import java.util.Stack; public class Forge implements ApplicationListener { - public static final String CURRENT_VERSION = "1.6.32.001"; + public static final String CURRENT_VERSION = "1.6.33.001"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; From 051e607724076a323dc29a7f7ac7c40c2c62c3f9 Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Thu, 26 Mar 2020 04:18:25 +0000 Subject: [PATCH 05/26] SLD edition typo - rogue comma --- forge-gui/res/editions/Secret Lair Drop Series.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Secret Lair Drop Series.txt b/forge-gui/res/editions/Secret Lair Drop Series.txt index add00a13e0f..1ac7b9f8930 100644 --- a/forge-gui/res/editions/Secret Lair Drop Series.txt +++ b/forge-gui/res/editions/Secret Lair Drop Series.txt @@ -44,7 +44,7 @@ Type=Other 52 M Meren of Clan Nel Toth 53 M Narset, Enlightened Master 54 M Oona, Queen of the Fae -55 M Saskia, the Unyielding +55 M Saskia the Unyielding 68 M Heliod, God of the Sun 69 M Karametra, God of Harvests 70 M Iroas, God of Victory From 6da9d86b1b21ed98859b6aeb785ba56a7aab7cd6 Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Thu, 26 Mar 2020 04:19:04 +0000 Subject: [PATCH 06/26] Editions files for SLU and SS3 --- .../res/editions/Secret Lair Ultimate Edition.txt | 12 ++++++++++++ .../res/editions/Signature Spellbook Chandra.txt | 9 +++++++++ 2 files changed, 21 insertions(+) create mode 100644 forge-gui/res/editions/Secret Lair Ultimate Edition.txt create mode 100644 forge-gui/res/editions/Signature Spellbook Chandra.txt diff --git a/forge-gui/res/editions/Secret Lair Ultimate Edition.txt b/forge-gui/res/editions/Secret Lair Ultimate Edition.txt new file mode 100644 index 00000000000..33fc84e11c6 --- /dev/null +++ b/forge-gui/res/editions/Secret Lair Ultimate Edition.txt @@ -0,0 +1,12 @@ +[metadata] +Code=SLU +Date=2020-05-29 +Name=Secret Lair: Ultimate Edition +Type=Reprint + +[cards] +1 R Marsh Flats +2 R Scalding Tarn +3 R Verdant Catacombs +4 R Arid Mesa +5 R Misty Rainforest diff --git a/forge-gui/res/editions/Signature Spellbook Chandra.txt b/forge-gui/res/editions/Signature Spellbook Chandra.txt new file mode 100644 index 00000000000..e9d17ca1d3f --- /dev/null +++ b/forge-gui/res/editions/Signature Spellbook Chandra.txt @@ -0,0 +1,9 @@ +[metadata] +Code=SS3 +Date=2020-06-26 +Name=Signature Spellbook: Chandra +Type=Reprint + +[cards] +1 M Chandra, Torch of Defiance +4 M Past in Flames From 7f8ddb0cab198486fa7904047ae72fdbd723e3c7 Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Fri, 27 Mar 2020 09:34:28 +0000 Subject: [PATCH 07/26] MB1 printsheets tweak --- forge-gui/res/blockdata/printsheets.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/blockdata/printsheets.txt b/forge-gui/res/blockdata/printsheets.txt index 3dc9401f5dd..771c0f531ff 100644 --- a/forge-gui/res/blockdata/printsheets.txt +++ b/forge-gui/res/blockdata/printsheets.txt @@ -3414,7 +3414,7 @@ Eldrazi Monument Eldritch Evolution Elesh Norn, Grand Cenobite Evra, Halcyon Witness -#Expropriate +Expropriate Fblthp, the Lost Felidar Sovereign Gideon Jura From 62aec9956ef1029c47d811349c52349ff111bf1d Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Sun, 29 Mar 2020 02:37:36 +0000 Subject: [PATCH 08/26] Hold the Perimeter! --- forge-gui/res/cardsfolder/h/hold_the_perimeter.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 forge-gui/res/cardsfolder/h/hold_the_perimeter.txt diff --git a/forge-gui/res/cardsfolder/h/hold_the_perimeter.txt b/forge-gui/res/cardsfolder/h/hold_the_perimeter.txt new file mode 100644 index 00000000000..edb0ff07a43 --- /dev/null +++ b/forge-gui/res/cardsfolder/h/hold_the_perimeter.txt @@ -0,0 +1,11 @@ +Name:Hold the Perimeter +ManaCost:no cost +Types:Conspiracy +Text:(Start the game with this conspiracy face up in the command zone.) +T:Mode$ Phase | Phase$ Upkeep | CheckSVar$ X | SVarCompare$ EQ1 | References$ X | ValidPlayer$ You | Execute$ TrigToken1 | EffectZone$ Command | TriggerDescription$ At the beginning of your first upkeep, create a 1/2 white Soldier creature token with defender. +SVar:X:Count$YourTurns +SVar:TrigToken1:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_2_soldier_defender | TokenOwner$ You | LegacyImage$ w 1 2 soldier defender cn2 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player.Other+IsNotRemembered | Execute$ TrigToken2 | EffectZone$ Command | TriggerDescription$ At the beginning of each other player’s first upkeep, that player creates a 1/1 red Goblin creature token with “This creature can’t block.” +SVar:TrigToken2:DB$ Token | TokenAmount$ 1 | TokenScript$ r_1_1_goblin_noblock | TokenOwner$ TriggeredPlayer | LegacyImage$ r 1 1 goblin noblock cn2 | SubAbility$ RememberPlayer +SVar:RememberPlayer:DB$ Pump | RememberObjects$ TriggeredPlayer +Oracle:(Start the game with this conspiracy face up in the command zone.)\nAt the beginning of your first upkeep, create a 1/2 white Soldier creature token with defender.\nAt the beginning of each other player’s first upkeep, that player creates a 1/1 red Goblin creature token with “This creature can’t block.” From eb03c01cb0f0bef6121fb7160b31dadb81a4557d Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Sun, 29 Mar 2020 02:38:16 +0000 Subject: [PATCH 09/26] Natural Unity fix --- forge-gui/res/cardsfolder/n/natural_unity.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/n/natural_unity.txt b/forge-gui/res/cardsfolder/n/natural_unity.txt index 8d2f338263b..ce8603b2c26 100644 --- a/forge-gui/res/cardsfolder/n/natural_unity.txt +++ b/forge-gui/res/cardsfolder/n/natural_unity.txt @@ -2,7 +2,7 @@ Name:Natural Unity ManaCost:no cost Types:Conspiracy K:Hidden agenda -S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.NamedCard+YouCtrl | EffectZone$ Battlefield | AddTrigger$ NUCombat | AddSVar$ NUCounter | Description$ Creatures you control with the chosen name have "At the beginning of combat on your turn, you may pay {G}. If you do, put a +1/+1 counter on this creature." +S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.NamedCard+YouCtrl | AffectedZone$ Battlefield | AddTrigger$ NUCombat | AddSVar$ NUCounter | Description$ Creatures you control with the chosen name have "At the beginning of combat on your turn, you may pay {G}. If you do, put a +1/+1 counter on this creature." SVar:NUCombat:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ NUCounter | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, you may pay {G}. If you do, put a +1/+1 counter on this creature. SVar:NUCounter:AB$ PutCounter | Cost$ G | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 SVar:AgendaLogic:BestCreatureInComputerDeck From 65947bee287f9f83204727a9b9376e57a01e110b Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Sun, 29 Mar 2020 02:38:48 +0000 Subject: [PATCH 10/26] More CN2 "draft matters" draftable --- forge-gui/res/blockdata/printsheets.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/blockdata/printsheets.txt b/forge-gui/res/blockdata/printsheets.txt index 771c0f531ff..259bfdfd988 100644 --- a/forge-gui/res/blockdata/printsheets.txt +++ b/forge-gui/res/blockdata/printsheets.txt @@ -1020,11 +1020,11 @@ Wasteland|EXP [CN2 Draft Matters] Adriana's Valor -#Assemble the Rank and Vile +Assemble the Rank and Vile Echoing Boon #Emissary's Ploy Hired Heist -#Hold the Permiter +Hold the Perimeter Hymn of the Wilds Incendiary Dissent Natural Unity @@ -3617,11 +3617,11 @@ Stalking Stones+|FMB1 [CN2 Not In Normal Slots] Adriana's Valor -#Assemble the Rank and Vile +Assemble the Rank and Vile Echoing Boon #Emissary's Ploy Hired Heist -#Hold the Permiter +Hold the Perimeter Hymn of the Wilds Incendiary Dissent Natural Unity From 4bb0bcfa903667bdcf3390ceb83b428eb7b45120 Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Sun, 29 Mar 2020 02:39:46 +0000 Subject: [PATCH 11/26] Pyramids! --- forge-gui/res/cardsfolder/p/pyramids.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/p/pyramids.txt diff --git a/forge-gui/res/cardsfolder/p/pyramids.txt b/forge-gui/res/cardsfolder/p/pyramids.txt new file mode 100644 index 00000000000..51a2c93d266 --- /dev/null +++ b/forge-gui/res/cardsfolder/p/pyramids.txt @@ -0,0 +1,10 @@ +Name:Pyramids +ManaCost:6 +Types:Artifact +A:AB$ Charm | Cost$ 2 | Choices$ DBDestroy,DBProtect | Defined$ You +SVar:DBDestroy:DB$ Destroy | ValidTgts$ Aura.AttachedTo Land | TgtPrompt$ Select target Aura attached to a land | SpellDescription$ Destroy target Aura attached to a land. +SVar:DBProtect:DB$ Effect | ValidTgts$ Land | TgtPrompt$ Select target land | ReplacementEffects$ DBRemove | SVars$ ExileEffect,RemoveDamage | ForgetOnMoved$ Battlefield | RememberObjects$ Targeted | SpellDescription$ The next time target land would be destroyed this turn, remove all damage marked on it instead. +SVar:DBRemove:Event$ Destroy | ValidCard$ Land.IsRemembered | ReplaceWith$ RemoveDamage | Description$ The next time target land would be destroyed this turn, remove all damage marked on it instead. +SVar:RemoveDamage:DB$ DealDamage | Defined$ ReplacedCard | Remove$ All | SubAbility$ ExileEffect +SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +Oracle:{2}: Choose one —\n• Destroy target Aura attached to a land.\n• The next time target land would be destroyed this turn, remove all damage marked on it instead. From 1c61030aae1ced46058b78fe638a3500feb26176 Mon Sep 17 00:00:00 2001 From: friarsol Date: Mon, 30 Mar 2020 21:40:46 -0400 Subject: [PATCH 12/26] A player who lost cannot initiate combat --- forge-game/src/main/java/forge/game/player/Player.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index f21c28a6d60..71e34fc7a8b 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -2525,6 +2525,10 @@ public class Player extends GameEntity implements Comparable { } public boolean isSkippingCombat() { + if (hasLost()) { + return true; + } + if (hasKeyword("Skip your next combat phase.")) { return true; } From 7c9849f845bc29e23925d772a7d3ce0cc837bdb4 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 31 Mar 2020 10:54:27 +0800 Subject: [PATCH 13/26] Add preference to enable/disable loading of Unknown Cards. If a user don't wants to load a certain cards from deleted set/s in edition folder, you can do so by disabling this option. --- forge-core/src/main/java/forge/StaticData.java | 10 +++++----- forge-core/src/main/java/forge/card/CardDb.java | 4 ++-- .../screens/home/settings/CSubmenuPreferences.java | 1 + .../screens/home/settings/VSubmenuPreferences.java | 9 +++++++++ .../gamesimulationtests/util/CardDatabaseHelper.java | 2 +- .../src/forge/screens/settings/SettingsPage.java | 4 ++++ forge-gui/src/main/java/forge/model/FModel.java | 2 +- .../main/java/forge/properties/ForgePreferences.java | 1 + 8 files changed, 24 insertions(+), 9 deletions(-) diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index a35b3887935..af533330a5b 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -54,11 +54,11 @@ public class StaticData { private static StaticData lastInstance = null; - public StaticData(CardStorageReader cardReader, String editionFolder, String blockDataFolder) { - this(cardReader, null, editionFolder, blockDataFolder); + public StaticData(CardStorageReader cardReader, String editionFolder, String blockDataFolder, boolean enableUnknownCards) { + this(cardReader, null, editionFolder, blockDataFolder, enableUnknownCards); } - public StaticData(CardStorageReader cardReader, CardStorageReader tokenReader, String editionFolder, String blockDataFolder) { + public StaticData(CardStorageReader cardReader, CardStorageReader tokenReader, String editionFolder, String blockDataFolder, boolean enableUnknownCards) { this.cardReader = cardReader; this.tokenReader = tokenReader; this.editions = new CardEdition.Collection(new CardEdition.Reader(new File(editionFolder))); @@ -84,8 +84,8 @@ public class StaticData { variantCards = new CardDb(variantsCards, editions); //must initialize after establish field values for the sake of card image logic - commonCards.initialize(false, false); - variantCards.initialize(false, false); + commonCards.initialize(false, false, enableUnknownCards); + variantCards.initialize(false, false, enableUnknownCards); } { diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 7fcfbfd2a49..a7b10ec600e 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -165,7 +165,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { reIndex(); } - public void initialize(boolean logMissingPerEdition, boolean logMissingSummary) { + public void initialize(boolean logMissingPerEdition, boolean logMissingSummary, boolean enableUnknownCards) { Set allMissingCards = new LinkedHashSet<>(); List missingCards = new ArrayList<>(); CardEdition upcomingSet = null; @@ -218,7 +218,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { if (!contains(cr.getName())) { if (upcomingSet != null) { addCard(new PaperCard(cr, upcomingSet.getCode(), CardRarity.Unknown, 1)); - } else { + } else if(enableUnknownCards) { System.err.println("The card " + cr.getName() + " was not assigned to any set. Adding it to UNKNOWN set... to fix see res/editions/ folder. "); addCard(new PaperCard(cr, CardEdition.UNKNOWN.getCode(), CardRarity.Special, 1)); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java index 3e26afdf007..10e52139fc1 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java @@ -114,6 +114,7 @@ public enum CSubmenuPreferences implements ICDoc { lstControls.add(Pair.of(view.getCbRemoveArtifacts(), FPref.DECKGEN_ARTIFACTS)); lstControls.add(Pair.of(view.getCbSingletons(), FPref.DECKGEN_SINGLETONS)); lstControls.add(Pair.of(view.getCbEnableAICheats(), FPref.UI_ENABLE_AI_CHEATS)); + lstControls.add(Pair.of(view.getCbEnableUnknownCards(), FPref.UI_LOAD_UNKNOWN_CARDS)); lstControls.add(Pair.of(view.getCbImageFetcher(), FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER)); lstControls.add(Pair.of(view.getCbDisplayFoil(), FPref.UI_OVERLAY_FOIL_EFFECT)); lstControls.add(Pair.of(view.getCbRandomFoil(), FPref.UI_RANDOM_FOIL)); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java index 567a017c0e1..b94deaf4790 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java @@ -107,6 +107,7 @@ public enum VSubmenuPreferences implements IVSubmenu { private final JCheckBox cbShowStormCount = new OptionsCheckBox(localizer.getMessage("cbShowStormCount")); private final JCheckBox cbRemindOnPriority = new OptionsCheckBox(localizer.getMessage("cbRemindOnPriority")); private final JCheckBox cbUseSentry = new OptionsCheckBox(localizer.getMessage("cbUseSentry")); + private final JCheckBox cbEnableUnknownCards = new OptionsCheckBox("Enable Unknown Cards"); private final Map shortcutFields = new HashMap<>(); @@ -287,6 +288,9 @@ public enum VSubmenuPreferences implements IVSubmenu { pnlPrefs.add(cbLoadHistoricFormats, titleConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlLoadHistoricFormats")), descriptionConstraints); + pnlPrefs.add(cbEnableUnknownCards, titleConstraints); + pnlPrefs.add(new NoteLabel("Enable Unknown Cards to be loaded to Unknown Set. (Requires restart)"), descriptionConstraints); + // Graphic Options pnlPrefs.add(new SectionLabel(localizer.getMessage("GraphicOptions")), sectionConstraints + ", gaptop 2%"); @@ -580,6 +584,11 @@ public enum VSubmenuPreferences implements IVSubmenu { return cbEnableAICheats; } + /** @return {@link javax.swing.JCheckBox} */ + public JCheckBox getCbEnableUnknownCards() { + return cbEnableUnknownCards; + } + /** @return {@link javax.swing.JCheckBox} */ public JCheckBox getCbImageFetcher() { return cbImageFetcher; diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/CardDatabaseHelper.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/CardDatabaseHelper.java index 972e579a28f..10e73f4d8af 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/CardDatabaseHelper.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/CardDatabaseHelper.java @@ -29,7 +29,7 @@ public class CardDatabaseHelper { private static void initialize() { final CardStorageReader reader = new CardStorageReader(ForgeConstants.CARD_DATA_DIR, null, FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY)); - staticData = new StaticData(reader, ForgeConstants.EDITIONS_DIR, ForgeConstants.BLOCK_DATA_DIR); + staticData = new StaticData(reader, ForgeConstants.EDITIONS_DIR, ForgeConstants.BLOCK_DATA_DIR, FModel.getPreferences().getPrefBoolean(FPref.UI_LOAD_UNKNOWN_CARDS)); } private static boolean hasBeenInitialized() { diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index 975eec792e8..a17cbf3fb68 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -331,6 +331,10 @@ public class SettingsPage extends TabPage { Forge.showFPS = FModel.getPreferences().getPrefBoolean(FPref.UI_SHOW_FPS); } },4); + lstSettings.addItem(new BooleanSetting(FPref.UI_LOAD_UNKNOWN_CARDS, + "Enable Unknown Cards", + "Enable Unknown Cards to be loaded to Unknown Set. (Requires restart)"), + 4); lstSettings.addItem(new CustomSelectSetting(FPref.UI_CARD_COUNTER_DISPLAY_TYPE, localizer.getMessage("cbpCounterDisplayType"), localizer.getMessage("nlCounterDisplayType"), diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index a574d3cd493..fe3dc41129f 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -152,7 +152,7 @@ public final class FModel { FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY)); final CardStorageReader tokenReader = new CardStorageReader(ForgeConstants.TOKEN_DATA_DIR, progressBarBridge, FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY)); - magicDb = new StaticData(reader, tokenReader, ForgeConstants.EDITIONS_DIR, ForgeConstants.BLOCK_DATA_DIR); + magicDb = new StaticData(reader, tokenReader, ForgeConstants.EDITIONS_DIR, ForgeConstants.BLOCK_DATA_DIR, FModel.getPreferences().getPrefBoolean(FPref.UI_LOAD_UNKNOWN_CARDS)); CardTranslation.preloadTranslation(preferences.getPref(FPref.UI_LANGUAGE), ForgeConstants.LANG_DIR); //create profile dirs if they don't already exist diff --git a/forge-gui/src/main/java/forge/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/properties/ForgePreferences.java index c3001f43e0a..78aa7f65ed2 100644 --- a/forge-gui/src/main/java/forge/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/properties/ForgePreferences.java @@ -139,6 +139,7 @@ public class ForgePreferences extends PreferencesStore { UI_ENABLE_PRELOAD_EXTENDED_ART("false"), UI_ENABLE_BORDER_MASKING("false"), UI_SHOW_FPS("false"), + UI_LOAD_UNKNOWN_CARDS("true"), UI_ALLOW_ORDER_GRAVEYARD_WHEN_NEEDED ("Never"), UI_DEFAULT_FONT_SIZE("12"), UI_SELECT_FROM_CARD_DISPLAYS("true"), From e57e87d3c21fad985d0e9971ace7c8ac404c6539 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 31 Mar 2020 12:01:57 +0800 Subject: [PATCH 14/26] Fix double "- - " on stack description --- forge-gui-mobile/src/forge/screens/match/views/VStack.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forge-gui-mobile/src/forge/screens/match/views/VStack.java b/forge-gui-mobile/src/forge/screens/match/views/VStack.java index 8f83fef3035..07a9d9468ab 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VStack.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VStack.java @@ -386,6 +386,7 @@ public class VStack extends FDropDown { if (index == -1) { newtext = TextUtil.fastReplace(TextUtil.fastReplace(text.trim(),"--","-"),"- -","-"); + newtext = TextUtil.fastReplace(newtext, "- - ", "- "); textRenderer.drawText(g, name + " " + (name.length() > 1 ? cId : "") + "\n" + (newtext.length() > 1 ? newtext : ""), FONT, foreColor, x, y, w, h, y, h, true, Align.left, true); @@ -399,6 +400,7 @@ public class VStack extends FDropDown { else { newtext = TextUtil.fastReplace(TextUtil.fastReplace(newtext,name+" -","-"), "\n ", "\n"); newtext = "\n"+ TextUtil.fastReplace(newtext.trim(),"--","-"); + newtext = TextUtil.fastReplace(newtext, "- - ", "- "); textRenderer.drawText(g, name+" "+cId+newtext, FONT, foreColor, x, y, w, h, y, h, true, Align.left, true); } } From 70b7af6f16d5027be9853ba1767e9306c91f8b8d Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Tue, 31 Mar 2020 05:02:47 +0000 Subject: [PATCH 15/26] narcomoeba.txt fix --- forge-gui/res/cardsfolder/n/narcomoeba.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/n/narcomoeba.txt b/forge-gui/res/cardsfolder/n/narcomoeba.txt index bd92f97f581..57fd43a49cb 100644 --- a/forge-gui/res/cardsfolder/n/narcomoeba.txt +++ b/forge-gui/res/cardsfolder/n/narcomoeba.txt @@ -4,6 +4,5 @@ Types:Creature Illusion PT:1/1 K:Flying T:Mode$ ChangesZone | Origin$ Library | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into your graveyard from your library, you may put it onto the battlefield. -SVar:TrigChange:DB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ Self -SVar:Picture:http://www.wizards.com/global/images/magic/general/narcomoeba.jpg +SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ TriggeredCard Oracle:Flying\nWhen Narcomoeba is put into your graveyard from your library, you may put it onto the battlefield. From 9811eedfc544f3e6a7e99699347a663c3f0ea8af Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Tue, 31 Mar 2020 05:03:34 +0000 Subject: [PATCH 16/26] Nissa's Pilgrimage fix --- forge-gui/res/cardsfolder/n/nissas_pilgrimage.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/n/nissas_pilgrimage.txt b/forge-gui/res/cardsfolder/n/nissas_pilgrimage.txt index f89143a06a0..3dfef99dc62 100644 --- a/forge-gui/res/cardsfolder/n/nissas_pilgrimage.txt +++ b/forge-gui/res/cardsfolder/n/nissas_pilgrimage.txt @@ -2,7 +2,7 @@ Name:Nissa's Pilgrimage ManaCost:2 G Types:Sorcery A:SP$ ChangeZone | Cost$ 2 G | Origin$ Library | Destination$ Library | ChangeType$ Land.Basic+Forest | ChangeNum$ X | References$ X,Y | RememberChanged$ True | SubAbility$ DBBattlefield | Shuffle$ False | StackDescription$ SpellDescription | SpellDescription$ Search your library for up to two basic Forest cards, reveal those cards, and put one onto the battlefield tapped and the rest into your hand. Then shuffle your library. Spell mastery — If there are two or more instant or sorcery cards in your graveyard, search your library for up to three basic Forest cards instead of two. -SVar:DBBattlefield:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | SubAbility$ DBHand | ChangeType$ Card.IsRemembered | ChangeNum$ 1 | Mandatory$ True | NoLooking$ True | SelectPrompt$ Select a card to go to the battlefield | Shuffle$ False | StackDescription$ None +SVar:DBBattlefield:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | SubAbility$ DBHand | ChangeType$ Card.IsRemembered | ChangeNum$ 1 | ForgetChanged$ True | Mandatory$ True | NoLooking$ True | SelectPrompt$ Select a card to go to the battlefield | Shuffle$ False | StackDescription$ None SVar:DBHand:DB$ ChangeZone | Origin$ Library | Destination$ Hand | Defined$ Remembered | NoLooking$ True | StackDescription$ None | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Compare Y GE2.3.2 From cd8410e87a7489b86cab9512a0b91fec7b2683f9 Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Tue, 31 Mar 2020 05:03:55 +0000 Subject: [PATCH 17/26] Faerie Artisans - trigger tidying --- forge-gui/res/cardsfolder/f/faerie_artisans.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/f/faerie_artisans.txt b/forge-gui/res/cardsfolder/f/faerie_artisans.txt index 79e22af4b84..99c4c246d6d 100644 --- a/forge-gui/res/cardsfolder/f/faerie_artisans.txt +++ b/forge-gui/res/cardsfolder/f/faerie_artisans.txt @@ -3,10 +3,9 @@ ManaCost:3 U Types:Creature Faerie Artificer PT:2/2 K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken+OppCtrl | TriggerZones$ Battlefield | Execute$ TrigImprint | TriggerDescription$Whenever a nontoken creature enters the battlefield under an opponent's control, create a token that's a copy of that creature except that it's an artifact in addition to its other types. Then exile all other tokens created with Faerie Artisans. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken+OppCtrl | TriggerZones$ Battlefield | Execute$ TrigImprint | TriggerDescription$ Whenever a nontoken creature enters the battlefield under an opponent's control, create a token that's a copy of that creature except that it's an artifact in addition to its other types. Then exile all other tokens created with CARDNAME. SVar:TrigImprint:DB$ Pump | ImprintCards$ Remembered | SubAbility$ DBCopy SVar:DBCopy:DB$ CopyPermanent | Defined$ TriggeredCard | Controller$ You | AddTypes$ Artifact | RememberCopied$ True | SubAbility$ DBChangeZoneAll SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Card.IsImprinted DeckHas:Ability$Token -SVar:Picture:http://www.wizards.com/global/images/magic/general/faerie_artisans.jpg Oracle:Flying\nWhenever a nontoken creature enters the battlefield under an opponent's control, create a token that's a copy of that creature except that it's an artifact in addition to its other types. Then exile all other tokens created with Faerie Artisans. From faf8c579072534a076e62b6886c80a17bb954af2 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 31 Mar 2020 13:36:45 +0800 Subject: [PATCH 18/26] Fix stack description Fix "null damage" & "null counter" stack description, and Volcano Hellion crash --- .../ability/effects/CountersPutEffect.java | 19 +++++----- .../ability/effects/DamageDealEffect.java | 36 +++++++++++-------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java index 2f48a5a20f6..9a1048d83fb 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -78,13 +78,15 @@ public class CountersPutEffect extends SpellAbilityEffect { final List targetCards = SpellAbilityEffect.getTargetCards(spellAbility); for(int i = 0; i < targetCards.size(); i++) { Card targetCard = targetCards.get(i); - stringBuilder.append(targetCard).append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetCard)).append(" counter)"); + if (spellAbility.getTargetRestrictions().getDividedMap().get(targetCard) != null) { // fix null counter stack description + stringBuilder.append(targetCard).append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetCard)).append(" counter)"); - if(i == targetCards.size() - 2) { - stringBuilder.append(" and "); - } - else if(i + 1 < targetCards.size()) { - stringBuilder.append(", "); + if(i == targetCards.size() - 2) { + stringBuilder.append(" and "); + } + else if(i + 1 < targetCards.size()) { + stringBuilder.append(", "); + } } } } else { @@ -103,9 +105,8 @@ public class CountersPutEffect extends SpellAbilityEffect { } } } - stringBuilder.append("."); - - return stringBuilder.toString(); + //stringBuilder.append("."); + return stringBuilder.toString().trim() + "."; } @Override diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java index 9a80817d6e3..8e123ccab94 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java @@ -30,7 +30,12 @@ public class DamageDealEffect extends DamageBaseEffect { // when damageStackDescription is called, just build exactly what is happening final StringBuilder stringBuilder = new StringBuilder(); final String damage = spellAbility.getParam("NumDmg"); - final int dmg = AbilityUtils.calculateAmount(spellAbility.getHostCard(), damage, spellAbility); + int dmg; + try { // try-catch to fix Volcano Hellion Crash + dmg = AbilityUtils.calculateAmount(spellAbility.getHostCard(), damage, spellAbility); + } catch (NullPointerException e) { + dmg = 0; + } List targets = SpellAbilityEffect.getTargets(spellAbility); if (targets.isEmpty()) { @@ -63,25 +68,28 @@ public class DamageDealEffect extends DamageBaseEffect { // target cards for (int i = 0; i < targetCards.size(); i++) { Card targetCard = targetCards.get(i); - stringBuilder.append(targetCard).append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetCard)).append(" damage)"); + if (spellAbility.getTargetRestrictions().getDividedMap().get(targetCard) != null) { //fix null damage stack description + stringBuilder.append(targetCard).append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetCard)).append(" damage)"); - if (i == targetCount - 2) { - stringBuilder.append(" and "); - } else if (i + 1 < targetCount) { - stringBuilder.append(", "); + if (i == targetCount - 2) { + stringBuilder.append(" and "); + } else if (i + 1 < targetCount) { + stringBuilder.append(", "); + } } } // target players for (int i = 0; i < players.size(); i++) { - Player targetPlayer = players.get(i); - stringBuilder.append(targetPlayer).append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetPlayer)).append(" damage)"); + if (spellAbility.getTargetRestrictions().getDividedMap().get(targetPlayer) != null) { //fix null damage stack description + stringBuilder.append(targetPlayer).append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetPlayer)).append(" damage)"); - if (i == players.size() - 2) { - stringBuilder.append(" and "); - } else if (i + 1 < players.size()) { - stringBuilder.append(", "); + if (i == players.size() - 2) { + stringBuilder.append(" and "); + } else if (i + 1 < players.size()) { + stringBuilder.append(", "); + } } } @@ -104,8 +112,8 @@ public class DamageDealEffect extends DamageBaseEffect { } } - stringBuilder.append("."); - return stringBuilder.toString(); + //stringBuilder.append("."); + return stringBuilder.toString().trim() + "."; } /* (non-Javadoc) From ec463b414f93de8ed979ca46ea5faaa7c7bde392 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 31 Mar 2020 14:44:37 +0800 Subject: [PATCH 19/26] Refactor description --- .../ability/effects/CountersPutEffect.java | 20 ++++++------ .../ability/effects/DamageDealEffect.java | 31 ++++++++++--------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java index 9a1048d83fb..76c8ed3b6a8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -78,15 +78,15 @@ public class CountersPutEffect extends SpellAbilityEffect { final List targetCards = SpellAbilityEffect.getTargetCards(spellAbility); for(int i = 0; i < targetCards.size(); i++) { Card targetCard = targetCards.get(i); - if (spellAbility.getTargetRestrictions().getDividedMap().get(targetCard) != null) { // fix null counter stack description - stringBuilder.append(targetCard).append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetCard)).append(" counter)"); + stringBuilder.append(targetCard); + if (spellAbility.getTargetRestrictions().getDividedMap().get(targetCard) != null) // fix null counter stack description + stringBuilder.append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetCard)).append(" counter)"); - if(i == targetCards.size() - 2) { - stringBuilder.append(" and "); - } - else if(i + 1 < targetCards.size()) { - stringBuilder.append(", "); - } + if(i == targetCards.size() - 2) { + stringBuilder.append(" and "); + } + else if(i + 1 < targetCards.size()) { + stringBuilder.append(", "); } } } else { @@ -105,8 +105,8 @@ public class CountersPutEffect extends SpellAbilityEffect { } } } - //stringBuilder.append("."); - return stringBuilder.toString().trim() + "."; + stringBuilder.append("."); + return stringBuilder.toString(); } @Override diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java index 8e123ccab94..304ad563c05 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java @@ -58,7 +58,8 @@ public class DamageDealEffect extends DamageBaseEffect { stringBuilder.append("divided evenly (rounded down) to\n"); } else if (spellAbility.hasParam("DividedAsYouChoose")) { stringBuilder.append("divided to\n"); - } + } else + stringBuilder.append(" to "); final List targetCards = SpellAbilityEffect.getTargetCards(spellAbility); final List players = SpellAbilityEffect.getTargetPlayers(spellAbility); @@ -68,28 +69,28 @@ public class DamageDealEffect extends DamageBaseEffect { // target cards for (int i = 0; i < targetCards.size(); i++) { Card targetCard = targetCards.get(i); - if (spellAbility.getTargetRestrictions().getDividedMap().get(targetCard) != null) { //fix null damage stack description - stringBuilder.append(targetCard).append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetCard)).append(" damage)"); + stringBuilder.append(targetCard); + if (spellAbility.getTargetRestrictions().getDividedMap().get(targetCard) != null) //fix null damage stack description + stringBuilder.append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetCard)).append(" damage)"); - if (i == targetCount - 2) { - stringBuilder.append(" and "); - } else if (i + 1 < targetCount) { - stringBuilder.append(", "); - } + if (i == targetCount - 2) { + stringBuilder.append(" and "); + } else if (i + 1 < targetCount) { + stringBuilder.append(", "); } } // target players for (int i = 0; i < players.size(); i++) { Player targetPlayer = players.get(i); - if (spellAbility.getTargetRestrictions().getDividedMap().get(targetPlayer) != null) { //fix null damage stack description - stringBuilder.append(targetPlayer).append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetPlayer)).append(" damage)"); + stringBuilder.append(targetPlayer); + if (spellAbility.getTargetRestrictions().getDividedMap().get(targetPlayer) != null) //fix null damage stack description + stringBuilder.append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetPlayer)).append(" damage)"); - if (i == players.size() - 2) { - stringBuilder.append(" and "); - } else if (i + 1 < players.size()) { - stringBuilder.append(", "); - } + if (i == players.size() - 2) { + stringBuilder.append(" and "); + } else if (i + 1 < players.size()) { + stringBuilder.append(", "); } } From bf7b446586eb55e9dcb004299b3fe7c660fb0af6 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 31 Mar 2020 14:46:42 +0800 Subject: [PATCH 20/26] period --- .../java/forge/game/ability/effects/DamageDealEffect.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java index 304ad563c05..a8b53b4c711 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java @@ -113,8 +113,8 @@ public class DamageDealEffect extends DamageBaseEffect { } } - //stringBuilder.append("."); - return stringBuilder.toString().trim() + "."; + stringBuilder.append("."); + return stringBuilder.toString(); } /* (non-Javadoc) From 6bf72e682818f304b4bf30aa1d1385e871538409 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 31 Mar 2020 14:49:24 +0800 Subject: [PATCH 21/26] space --- .../main/java/forge/game/ability/effects/DamageDealEffect.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java index a8b53b4c711..2162c2d6b1c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java @@ -59,7 +59,7 @@ public class DamageDealEffect extends DamageBaseEffect { } else if (spellAbility.hasParam("DividedAsYouChoose")) { stringBuilder.append("divided to\n"); } else - stringBuilder.append(" to "); + stringBuilder.append("to "); final List targetCards = SpellAbilityEffect.getTargetCards(spellAbility); final List players = SpellAbilityEffect.getTargetPlayers(spellAbility); From 24db729e96711124d17a72bb04a7c5591115d7ae Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Tue, 31 Mar 2020 13:11:46 +0000 Subject: [PATCH 22/26] Tawnos's Coffin! --- .../ability/effects/CountersNoteEffect.java | 4 ++-- forge-gui/res/cardsfolder/t/tawnoss_coffin.txt | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/cardsfolder/t/tawnoss_coffin.txt diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersNoteEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersNoteEffect.java index b2705b69516..9cbd6c7258e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersNoteEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersNoteEffect.java @@ -28,9 +28,9 @@ public class CountersNoteEffect extends SpellAbilityEffect { GameEntityCounterTable table = new GameEntityCounterTable(); for (Card c : getDefinedCardsOrTargeted(sa)) { if (mode.equals(MODE_STORE)) { - noteCounters(c, source); + noteCounters(c, c); } else if (mode.equals(MODE_LOAD)) { - loadCounters(c, source, p, table); + loadCounters(c, c, p, table); } } table.triggerCountersPutAll(game); diff --git a/forge-gui/res/cardsfolder/t/tawnoss_coffin.txt b/forge-gui/res/cardsfolder/t/tawnoss_coffin.txt new file mode 100644 index 00000000000..20d74e2ceda --- /dev/null +++ b/forge-gui/res/cardsfolder/t/tawnoss_coffin.txt @@ -0,0 +1,18 @@ +Name:Tawnos's Coffin +ManaCost:4 +Types:Artifact +K:You may choose not to untap CARDNAME during your untap step. +A:AB$ Pump | Cost$ 3 T | ValidTgts$ Creature | ImprintCards$ Targeted | SubAbility$ RecordCounters | StackDescription$ SpellDescription | SpellDescription$ Exile target creature and all Auras attached to it. Note the number and kind of counters that were on that creature. When CARDNAME leaves the battlefield or becomes untapped, return that exiled card to the battlefield under its owner’s control tapped with the noted number and kind of counters on it. If you do, return the other exiled cards to the battlefield under their owner’s control attached to that permanent. +SVar:RecordCounters:DB$ NoteCounters | Mode$ Store | Defined$ Imprinted | SubAbility$ DBRememberAura +SVar:DBRememberAura:DB$ PumpAll | ValidCards$ Aura.AttachedTo Creature.IsImprinted | RememberAllPumped$ True | StackDescription$ None | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | Triggers$ LeavesPlay,Untap | SVars$ RestoreCounters,TrigReturn,TrigAuraReturn,ExileSelf | References$ LeavesPlay,Untap | ImprintCards$ ParentTarget | RememberObjects$ Remembered | SubAbility$ DBExile +SVar:DBExile:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Card.IsRemembered,Card.IsImprinted | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True +SVar:LeavesPlay:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.EffectSource | Execute$ RestoreCounters | TriggerController$ TriggeredCardController | TriggerDescription$ When EFFECTSOURCE leaves the battlefield or becomes untapped, return that exiled card to the battlefield under its owner’s control tapped with the noted number and kind of counters on it. If you do, return the other exiled cards to the battlefield under their owner’s control attached to that permanent. +SVar:Untap:Mode$ Untaps | ValidCard$ Card.EffectSource | Execute$ RestoreCounters | TriggerController$ TriggeredCardController | Secondary$ True | TriggerDescription$ When EFFECTSOURCE leaves the battlefield or becomes untapped, return that exiled card to the battlefield under its owner’s control tapped with the noted number and kind of counters on it. If you do, return the other exiled cards to the battlefield under their owner’s control attached to that permanent. +SVar:RestoreCounters:DB$ NoteCounters | Mode$ Load | Defined$ Imprinted | SubAbility$ TrigReturn +SVar:TrigReturn:DB$ ChangeZone | Defined$ Imprinted | Origin$ Exile | Destination$ Battlefield | Tapped$ True | SubAbility$ TrigAuraReturn +SVar:TrigAuraReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | AttachedTo$ Valid Creature.IsImprinted | SubAbility$ ExileSelf +SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self +AI:RemoveDeck:All +Oracle:You may choose not to untap Tawnos’s Coffin during your untap step.\n{3},{T}: Exile target creature and all Auras attached to it. Note the number and kind of counters that were on that creature. When Tawnos’s Coffin leaves the battlefield or becomes untapped, return that exiled card to the battlefield under its owner’s control tapped with the noted number and kind of counters on it. If you do, return the other exiled cards to the battlefield under their owner’s control attached to that permanent. From 447c3dff5a0451eceb13efc6920399bfb5a0db85 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 31 Mar 2020 23:12:22 +0800 Subject: [PATCH 23/26] Fix Plane and Phenomenon not triggering when the player PlaneswalkTo/Encounter to it... --- forge-gui/res/cardsfolder/a/aretopolis.txt | 2 +- forge-gui/res/cardsfolder/c/chaotic_aether.txt | 2 +- forge-gui/res/cardsfolder/f/furnace_layer.txt | 2 +- forge-gui/res/cardsfolder/g/grove_of_the_dreampods.txt | 2 +- forge-gui/res/cardsfolder/i/interplanar_tunnel.txt | 2 +- forge-gui/res/cardsfolder/k/kilnspire_district.txt | 2 +- forge-gui/res/cardsfolder/m/morphic_tide.txt | 2 +- forge-gui/res/cardsfolder/m/mutual_epiphany.txt | 2 +- forge-gui/res/cardsfolder/p/panopticon.txt | 2 +- forge-gui/res/cardsfolder/p/planewide_disaster.txt | 2 +- forge-gui/res/cardsfolder/q/quicksilver_sea.txt | 2 +- forge-gui/res/cardsfolder/r/reality_shaping.txt | 2 +- forge-gui/res/cardsfolder/s/spatial_merging.txt | 2 +- forge-gui/res/cardsfolder/t/the_aether_flues.txt | 2 +- forge-gui/res/cardsfolder/t/time_distortion.txt | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/aretopolis.txt b/forge-gui/res/cardsfolder/a/aretopolis.txt index e526ad01e69..b16967af1df 100644 --- a/forge-gui/res/cardsfolder/a/aretopolis.txt +++ b/forge-gui/res/cardsfolder/a/aretopolis.txt @@ -1,7 +1,7 @@ Name:Aretopolis ManaCost:no cost Types:Plane Kephalai -T:Mode$ PlaneswalkedTo | ValidCard$ Plane.Self | TriggerZones$ Command | Execute$ AcquireScrolls | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, put a scroll counter on CARDNAME, then you gain life equal to the number of scroll counters on it. +T:Mode$ PlaneswalkedTo | ValidCard$ Plane.Self | Execute$ AcquireScrolls | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, put a scroll counter on CARDNAME, then you gain life equal to the number of scroll counters on it. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ AcquireScrolls | TriggerZones$ Command | Secondary$ True | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, put a scroll counter on CARDNAME, then you gain life equal to the number of scroll counters on it. SVar:AcquireScrolls:DB$ PutCounter | Defined$ Self | CounterType$ SCROLL | CounterNum$ 1 | SubAbility$ ScrollsOfLife SVar:ScrollsOfLife:DB$ GainLife | Defined$ You | LifeAmount$ NumScrolls | References$ NumScrolls diff --git a/forge-gui/res/cardsfolder/c/chaotic_aether.txt b/forge-gui/res/cardsfolder/c/chaotic_aether.txt index da6ff6d34c7..8af06a34c6f 100644 --- a/forge-gui/res/cardsfolder/c/chaotic_aether.txt +++ b/forge-gui/res/cardsfolder/c/chaotic_aether.txt @@ -1,7 +1,7 @@ Name:Chaotic Aether ManaCost:no cost Types:Phenomenon -T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ Aether | TriggerDescription$ When you encounter CARDNAME, each blank roll of the planar dice is a {CHAOS} roll until a player planeswalks away from a plane. (Then planeswalk away from this phenomenon) +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ Aether | TriggerDescription$ When you encounter CARDNAME, each blank roll of the planar dice is a {CHAOS} roll until a player planeswalks away from a plane. (Then planeswalk away from this phenomenon) SVar:Aether:DB$ Effect | Name$ Chaotic Aether Effect | StaticAbilities$ STBlankIsChaos | Triggers$ TPWAway | SVars$ ExileSelf | SubAbility$ PWAway SVar:PWAway:DB$ Planeswalk | Cost$ 0 SVar:STBlankIsChaos:Mode$ Continuous | EffectZone$ Command | GlobalRule$ Each blank roll of the planar dice is a {CHAOS} roll. diff --git a/forge-gui/res/cardsfolder/f/furnace_layer.txt b/forge-gui/res/cardsfolder/f/furnace_layer.txt index 382e81d55bf..4890adfa936 100644 --- a/forge-gui/res/cardsfolder/f/furnace_layer.txt +++ b/forge-gui/res/cardsfolder/f/furnace_layer.txt @@ -1,7 +1,7 @@ Name:Furnace Layer ManaCost:no cost Types:Plane New Phyrexia -T:Mode$ PlaneswalkedTo | ValidCard$ Plane.Self | TriggerZones$ Command | Execute$ FurnaceDiscard | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, select target player at random. That player discards a card. If that player discards a land card this way, they lose 3 life. +T:Mode$ PlaneswalkedTo | ValidCard$ Plane.Self | Execute$ FurnaceDiscard | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, select target player at random. That player discards a card. If that player discards a land card this way, they lose 3 life. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ FurnaceDiscard | TriggerZones$ Command | Secondary$ True | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, select target player at random. That player discards a card. If that player discards a land card this way, they lose 3 life. SVar:FurnaceDiscard:DB$ Discard | ValidTgts$ Player | TargetsAtRandom$ True | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBLoseLife SVar:DBLoseLife:DB$ LoseLife | Defined$ Targeted | LifeAmount$ 3 | ConditionDefined$ Remembered | ConditionPresent$ Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup diff --git a/forge-gui/res/cardsfolder/g/grove_of_the_dreampods.txt b/forge-gui/res/cardsfolder/g/grove_of_the_dreampods.txt index 45845e4e53b..e3d7670e6cc 100644 --- a/forge-gui/res/cardsfolder/g/grove_of_the_dreampods.txt +++ b/forge-gui/res/cardsfolder/g/grove_of_the_dreampods.txt @@ -1,7 +1,7 @@ Name:Grove of the Dreampods ManaCost:no cost Types:Plane Fabacin -T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ DreampodsDig | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Put that card onto the battlefield and the rest on the bottom of your library in a random order. +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ DreampodsDig | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Put that card onto the battlefield and the rest on the bottom of your library in a random order. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ DreampodsDig | TriggerZones$ Command | Secondary$ True | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Put that card onto the battlefield and the rest on the bottom of your library in a random order. SVar:DreampodsDig:DB$ DigUntil | Valid$ Creature | ValidDescription$ creature | FoundDestination$ Battlefield | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RevealRandomOrder$ True T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, return target creature card from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/i/interplanar_tunnel.txt b/forge-gui/res/cardsfolder/i/interplanar_tunnel.txt index 6481777c956..b51e88b5131 100644 --- a/forge-gui/res/cardsfolder/i/interplanar_tunnel.txt +++ b/forge-gui/res/cardsfolder/i/interplanar_tunnel.txt @@ -1,7 +1,7 @@ Name:Interplanar Tunnel ManaCost:no cost Types:Phenomenon -T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ TrigDig | TriggerDescription$ When you encounter CARDNAME, reveal cards from the top of your planar deck until you reveal five plane cards. Put a plane card from among them on top of your planar deck, then put the rest of the revealed cards on the bottom in a random order. (Then planeswalk away from this phenomenon.) +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When you encounter CARDNAME, reveal cards from the top of your planar deck until you reveal five plane cards. Put a plane card from among them on top of your planar deck, then put the rest of the revealed cards on the bottom in a random order. (Then planeswalk away from this phenomenon.) SVar:TrigDig:DB$ Dig | DigNum$ 5 | ChangeNum$ 1 | SourceZone$ PlanarDeck | DestinationZone$ PlanarDeck | DestinationZone2$ PlanarDeck | LibraryPosition$ 0 | ChangeValid$ Plane | RestRandomOrder$ True | SubAbility$ Replaneswalk SVar:Replaneswalk:DB$ Planeswalk | Cost$ 0 Oracle:When you encounter Interplanar Tunnel, reveal cards from the top of your planar deck until you reveal five plane cards. Put a plane card from among them on top of your planar deck, then put the rest of the revealed cards on the bottom in a random order. (Then planeswalk away from this phenomenon.) diff --git a/forge-gui/res/cardsfolder/k/kilnspire_district.txt b/forge-gui/res/cardsfolder/k/kilnspire_district.txt index 10968a2c2ee..4bb0df42f1c 100644 --- a/forge-gui/res/cardsfolder/k/kilnspire_district.txt +++ b/forge-gui/res/cardsfolder/k/kilnspire_district.txt @@ -1,7 +1,7 @@ Name:Kilnspire District ManaCost:no cost Types:Plane Ravnica -T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ PutCounter | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your precombat main phase, put a charge counter on CARDNAME, then add {R} for each charge counter on it. +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ PutCounter | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your precombat main phase, put a charge counter on CARDNAME, then add {R} for each charge counter on it. T:Mode$ Phase | PreCombatMain$ True | ValidPlayer$ You | TriggerZones$ Command | Execute$ PutCounter | Secondary$ True | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your precombat main phase, put a charge counter on CARDNAME, then add {R} for each charge counter on it. SVar:PutCounter:DB$PutCounter | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 | SubAbility$ DBMana SVar:DBMana:DB$ Mana | Produced$ R | Amount$ Y | References$ Y diff --git a/forge-gui/res/cardsfolder/m/morphic_tide.txt b/forge-gui/res/cardsfolder/m/morphic_tide.txt index 9f27463b7f9..19d2e5b5e56 100644 --- a/forge-gui/res/cardsfolder/m/morphic_tide.txt +++ b/forge-gui/res/cardsfolder/m/morphic_tide.txt @@ -1,7 +1,7 @@ Name:Morphic Tide ManaCost:no cost Types:Phenomenon -T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ TrigPut | TriggerDescription$ When you encounter CARDNAME, starting with you, each player may put a permanent card from their hand onto the battlefield. (Then planeswalk away from this phenomenon.) +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigPut | TriggerDescription$ When you encounter CARDNAME, starting with you, each player may put a permanent card from their hand onto the battlefield. (Then planeswalk away from this phenomenon.) SVar:TrigPut:DB$ RepeatEach | StartingWithActivator$ True | RepeatPlayers$ Player | RepeatSubAbility$ DBShuffle | SubAbility$ ChangePermanent SVar:DBShuffle:DB$ ChangeZoneAll | ChangeType$ Permanent.RememberedPlayerOwn | Imprint$ True | Origin$ Battlefield | Destination$ Library | Shuffle$ True | SubAbility$ DBDig SVar:DBDig:DB$ Dig | Defined$ Remembered | NoMove$ True | DigNum$ WarpX | References$ WarpX | RememberRevealed$ True | Reveal$ True | SubAbility$ DBCleanImprint diff --git a/forge-gui/res/cardsfolder/m/mutual_epiphany.txt b/forge-gui/res/cardsfolder/m/mutual_epiphany.txt index 5c25471c2f7..a03226581ff 100644 --- a/forge-gui/res/cardsfolder/m/mutual_epiphany.txt +++ b/forge-gui/res/cardsfolder/m/mutual_epiphany.txt @@ -1,7 +1,7 @@ Name:Mutual Epiphany ManaCost:no cost Types:Phenomenon -T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ Epiphany | TriggerDescription$ When you encounter CARDNAME, each player draws four cards. (Then planeswalk away from this phenomenon) +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ Epiphany | TriggerDescription$ When you encounter CARDNAME, each player draws four cards. (Then planeswalk away from this phenomenon) SVar:Epiphany:DB$ Draw | Defined$ Player | NumCards$ 4 | SubAbility$ PWAway | SpellDescription$ Each player draws four cards. SVar:PWAway:DB$ Planeswalk | Cost$ 0 SVar:Picture:http://www.wizards.com/global/images/magic/general/mutual_epiphany.jpg diff --git a/forge-gui/res/cardsfolder/p/panopticon.txt b/forge-gui/res/cardsfolder/p/panopticon.txt index 8ff00fe0356..0180640c61b 100644 --- a/forge-gui/res/cardsfolder/p/panopticon.txt +++ b/forge-gui/res/cardsfolder/p/panopticon.txt @@ -1,7 +1,7 @@ Name:Panopticon ManaCost:no cost Types:Plane Mirrodin -T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ PanopticonDraw | TriggerDescription$ When you planeswalk to CARDNAME, draw a card. +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ PanopticonDraw | TriggerDescription$ When you planeswalk to CARDNAME, draw a card. T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | Execute$ PanopticonDraw | TriggerZones$ Command | TriggerDescription$ At the beginning of your draw step, draw an additional card. T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ PanopticonDraw | TriggerDescription$ Whenever you roll {CHAOS}, draw a card. SVar:PanopticonDraw:DB$ Draw | Defined$ You | NumCards$ 1 diff --git a/forge-gui/res/cardsfolder/p/planewide_disaster.txt b/forge-gui/res/cardsfolder/p/planewide_disaster.txt index 3264fab3bd3..f81fc737477 100644 --- a/forge-gui/res/cardsfolder/p/planewide_disaster.txt +++ b/forge-gui/res/cardsfolder/p/planewide_disaster.txt @@ -1,7 +1,7 @@ Name:Planewide Disaster ManaCost:no cost Types:Phenomenon -T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ Disaster | TriggerDescription$ When you encounter CARDNAME, destroy all creatures. (Then planeswalk away from this phenomenon) +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ Disaster | TriggerDescription$ When you encounter CARDNAME, destroy all creatures. (Then planeswalk away from this phenomenon) SVar:Disaster:DB$ DestroyAll | ValidCards$ Creature | SubAbility$ PWAway SVar:PWAway:DB$ Planeswalk | Cost$ 0 SVar:Picture:http://www.wizards.com/global/images/magic/general/planewide_disaster.jpg diff --git a/forge-gui/res/cardsfolder/q/quicksilver_sea.txt b/forge-gui/res/cardsfolder/q/quicksilver_sea.txt index d2d97f9c409..e654d641e31 100644 --- a/forge-gui/res/cardsfolder/q/quicksilver_sea.txt +++ b/forge-gui/res/cardsfolder/q/quicksilver_sea.txt @@ -1,7 +1,7 @@ Name:Quicksilver Sea ManaCost:no cost Types:Plane Mirrodin -T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ QuicksilverScry | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, scry 4. (Look at the top four cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ QuicksilverScry | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, scry 4. (Look at the top four cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ QuicksilverScry | TriggerZones$ Command | Secondary$ True | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, scry 4. (Look at the top four cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) SVar:QuicksilverScry:DB$ Scry | ScryNum$ 4 T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, reveal the top card of your library. You may play it without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/r/reality_shaping.txt b/forge-gui/res/cardsfolder/r/reality_shaping.txt index b7ebb20cda5..94ecfee2b93 100644 --- a/forge-gui/res/cardsfolder/r/reality_shaping.txt +++ b/forge-gui/res/cardsfolder/r/reality_shaping.txt @@ -1,7 +1,7 @@ Name:Reality Shaping ManaCost:no cost Types:Phenomenon -T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ TrigPutFromHand | TriggerDescription$ When you encounter CARDNAME, starting with you, each player may put a permanent card from their hand onto the battlefield. (Then planeswalk away from this phenomenon.) +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigPutFromHand | TriggerDescription$ When you encounter CARDNAME, starting with you, each player may put a permanent card from their hand onto the battlefield. (Then planeswalk away from this phenomenon.) SVar:TrigPutFromHand:DB$ RepeatEach | StartingWithActivator$ True | RepeatPlayers$ Player | RepeatSubAbility$ DBChangeZone | SubAbility$ PWAway SVar:DBChangeZone:DB$ ChangeZone | DefinedPlayer$ Player.IsRemembered | Choser$ Player.IsRemembered | ChangeType$ Permanent | ChangeNum$ 1 | Origin$ Hand | Destination$ Battlefield SVar:PWAway:DB$ Planeswalk | Cost$ 0 diff --git a/forge-gui/res/cardsfolder/s/spatial_merging.txt b/forge-gui/res/cardsfolder/s/spatial_merging.txt index 114b6bed220..2227d169428 100644 --- a/forge-gui/res/cardsfolder/s/spatial_merging.txt +++ b/forge-gui/res/cardsfolder/s/spatial_merging.txt @@ -1,7 +1,7 @@ Name:Spatial Merging ManaCost:no cost Types:Phenomenon -T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ TrigDig | TriggerDescription$ When you encounter CARDNAME, reveal cards from the top of your planar deck until you reveal two plane cards. Simultaneously planeswalk to both of them. Put all other cards revealed this way on the bottom of your planar deck in any order. +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When you encounter CARDNAME, reveal cards from the top of your planar deck until you reveal two plane cards. Simultaneously planeswalk to both of them. Put all other cards revealed this way on the bottom of your planar deck in any order. SVar:TrigDig:DB$ DigUntil | Amount$ 2 | Valid$ Plane | DigZone$ PlanarDeck | RememberFound$ True | FoundDestination$ PlanarDeck | RevealedDestination$ PlanarDeck | RevealedLibraryPosition$ -1 | SubAbility$ DBPWTo SVar:DBPWTo:DB$ Planeswalk | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/t/the_aether_flues.txt b/forge-gui/res/cardsfolder/t/the_aether_flues.txt index 81e2ce51bab..6a09e777551 100644 --- a/forge-gui/res/cardsfolder/t/the_aether_flues.txt +++ b/forge-gui/res/cardsfolder/t/the_aether_flues.txt @@ -1,7 +1,7 @@ Name:The Aether Flues ManaCost:no cost Types:Plane Iquatana -T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ FluesSacrifice | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, you may sacrifice a creature. If you do, reveal cards from the top of your library until you reveal a creature card, put that card onto the battlefield, then shuffle all other cards revealed this way into your library. +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ FluesSacrifice | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, you may sacrifice a creature. If you do, reveal cards from the top of your library until you reveal a creature card, put that card onto the battlefield, then shuffle all other cards revealed this way into your library. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ FluesSacrifice | TriggerZones$ Command | Secondary$ True | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, you may sacrifice a creature. If you do, reveal cards from the top of your library until you reveal a creature card, put that card onto the battlefield, then shuffle all other cards revealed this way into your library. SVar:FluesSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature | Amount$ 1 | RememberSacrificed$ True | SubAbility$ FluesDig SVar:FluesDig:DB$ DigUntil | Valid$ Creature | ValidDescription$ creature | FoundDestination$ Battlefield | RevealedDestination$ Library | Shuffle$ True | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ1 | SubAbility$ DBCleanup diff --git a/forge-gui/res/cardsfolder/t/time_distortion.txt b/forge-gui/res/cardsfolder/t/time_distortion.txt index 5d80ee981ce..1e520040612 100644 --- a/forge-gui/res/cardsfolder/t/time_distortion.txt +++ b/forge-gui/res/cardsfolder/t/time_distortion.txt @@ -1,7 +1,7 @@ Name:Time Distortion ManaCost:no cost Types:Phenomenon -T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ TrigReverse | TriggerDescription$ When you encounter CARDNAME, reverse the game's turn order. (For example, if play had proceeded clockwise around the table, it now goes counterclockwise. Then planeswalk away from this phenomenon.) +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigReverse | TriggerDescription$ When you encounter CARDNAME, reverse the game's turn order. (For example, if play had proceeded clockwise around the table, it now goes counterclockwise. Then planeswalk away from this phenomenon.) SVar:TrigReverse:DB$ ReverseTurnOrder | SubAbility$ PWAway SVar:PWAway:DB$ Planeswalk | Cost$ 0 SVar:Picture:http://www.wizards.com/global/images/magic/general/time_distortion.jpg From eca7ea2fbe465e92d657d3be6fff8d2287dbf06d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 31 Mar 2020 23:41:20 +0800 Subject: [PATCH 24/26] Fix Skybreen --- forge-gui/res/cardsfolder/s/skybreen.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/skybreen.txt b/forge-gui/res/cardsfolder/s/skybreen.txt index 3206bb61e0c..c267a214e0b 100644 --- a/forge-gui/res/cardsfolder/s/skybreen.txt +++ b/forge-gui/res/cardsfolder/s/skybreen.txt @@ -1,7 +1,7 @@ Name:Skybreen ManaCost:no cost Types:Plane Kaldheim -S:Mode$ Continuous | Affected$ Card.TopLibrary | AffectedZone$ Library | MayLookAt$ Player | Description$ Players play with the top card of their libraries revealed. +S:Mode$ Continuous | EffectZone$ Command | Affected$ Card.TopLibrary | AffectedZone$ Library | MayLookAt$ Player | Description$ Players play with the top card of their libraries revealed. S:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card.sharesCardTypeWith EachTopLibrary | Description$ Spells that share a card type with the top card of a library can't be cast. T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, target player loses life equal to the number of cards in their hand. SVar:RolledChaos:DB$ LoseLife | ValidTgts$ Player | LifeAmount$ Y | References$ Y From 41dbc468bdcc3b798daaebe51196272ce00f9a91 Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Tue, 31 Mar 2020 17:15:35 +0000 Subject: [PATCH 25/26] Silverblade Paladin detail cleanup --- forge-game/src/main/java/forge/game/keyword/Keyword.java | 2 +- forge-gui/res/cardsfolder/s/silverblade_paladin.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index 5a6e3c33c6c..711aeb2d65c 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -127,7 +127,7 @@ public enum Keyword { SHROUD("Shroud", SimpleKeyword.class, true, "This can't be the target of spells or abilities."), SKULK("Skulk", SimpleKeyword.class, true, "This creature can't be blocked by creatures with greater power."), SCAVENGE("Scavenge", KeywordWithCost.class, false, "%s, Exile this card from your graveyard: Put a number of +1/+1 counters equal to this card's power on target creature. Scavenge only as a sorcery."), - SOULBOND("Souldbond", SimpleKeyword.class, true, "You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them"), + SOULBOND("Soulbond", SimpleKeyword.class, true, "You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them."), SOULSHIFT("Soulshift", KeywordWithAmount.class, false, "When this creature dies, you may return target Spirit card with converted mana cost %d or less from your graveyard to your hand."), SPECTACLE("Spectacle", KeywordWithCost.class, false, "You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn."), SPLICE("Splice", KeywordWithCostAndType.class, false, "As you cast an %2$s spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell."), diff --git a/forge-gui/res/cardsfolder/s/silverblade_paladin.txt b/forge-gui/res/cardsfolder/s/silverblade_paladin.txt index 050b834d63a..5eac0e468bb 100644 --- a/forge-gui/res/cardsfolder/s/silverblade_paladin.txt +++ b/forge-gui/res/cardsfolder/s/silverblade_paladin.txt @@ -3,6 +3,6 @@ ManaCost:1 W W Types:Creature Human Knight PT:2/2 K:Soulbond -S:Mode$ Continuous | Affected$ Creature.PairedWith,Creature.Self+Paired | AddKeyword$ Double Strike | Description$ As long as CARDNAME is paired with another creature, both creature have double strike. +S:Mode$ Continuous | Affected$ Creature.PairedWith,Creature.Self+Paired | AddKeyword$ Double Strike | Description$ As long as CARDNAME is paired with another creature, both creatures have double strike. SVar:Picture:http://www.wizards.com/global/images/magic/general/silverblade_paladin.jpg Oracle:Soulbond (You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them.)\nAs long as Silverblade Paladin is paired with another creature, both creatures have double strike. From ed67aafe2e7432ee94d49a479e400e431153b9bd Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 2 Apr 2020 12:25:29 +0300 Subject: [PATCH 26/26] - Added puzzles PS_THB8 and PS_THB9. --- forge-gui/res/puzzle/PS_THB8.pzl | 16 ++++++++++++++++ forge-gui/res/puzzle/PS_THB9.pzl | 19 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_THB8.pzl create mode 100644 forge-gui/res/puzzle/PS_THB9.pzl diff --git a/forge-gui/res/puzzle/PS_THB8.pzl b/forge-gui/res/puzzle/PS_THB8.pzl new file mode 100644 index 00000000000..e3649191a1f --- /dev/null +++ b/forge-gui/res/puzzle/PS_THB8.pzl @@ -0,0 +1,16 @@ +[metadata] +Name:Possibility Storm - Theros Beyond Death #08 +URL:https://i2.wp.com/www.possibilitystorm.com/wp-content/uploads/2020/03/151.-THB8-scaled.jpg +Goal:Win +Turns:1 +Difficulty:Uncommon +Description:Win this turn. +[state] +humanlife=20 +ailife=23 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Bone Splinters;Gray Merchant of Asphodel;Mogis's Favor;Kaya's Ghostform;Massacre Girl +humanbattlefield=Nightmare Shepherd;Nightmare Shepherd;Nyx Lotus;Swamp;Swamp;Swamp;Swamp;Swamp;Swamp +aibattlefield=Bishop of Wings;Angelic Guardian;Sunblade Angel diff --git a/forge-gui/res/puzzle/PS_THB9.pzl b/forge-gui/res/puzzle/PS_THB9.pzl new file mode 100644 index 00000000000..0524bae6e5a --- /dev/null +++ b/forge-gui/res/puzzle/PS_THB9.pzl @@ -0,0 +1,19 @@ +[metadata] +Name:Possibility Storm - Theros Beyond Death #09 +URL:https://i0.wp.com/www.possibilitystorm.com/wp-content/uploads/2020/03/152.-THB9-scaled.jpg +Goal:Win +Turns:1 +Difficulty:Mythic +Description:Win this turn. Assume your opponent has no mana available and no cards in hand. Assume both players have over 30 cards left in their library, and that any drawn are irrelevant to the puzzle. +[state] +humanlife=2 +ailife=94 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Terror of Mount Velus;Awaken the Erstwhile;Dragon Mage;Corpse Knight;Fling +humanlibrary=Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt +humanbattlefield=The Royal Scions|Counters:LOYALTY=8;Purphoros, Bronze-Blooded;Smothering Tithe;Mace of the Valiant;Bag of Holding;Bag of Holding;Temple of Malice|NoETBTrigs;Temple of Malice|NoETBTrigs;Temple of Malice|NoETBTrigs;Temple of Malice|NoETBTrigs;Temple of Triumph|NoETBTrigs;Temple of Triumph|NoETBTrigs;Temple of Triumph|NoETBTrigs;Temple of Triumph|NoETBTrigs +ailibrary=Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt +aibattlefield=Knight of Autumn;Vindictive Vampire;Ajani's Pridemate|Counters:P1P1=15;Ajani, Strength of the Pride|Counters:LOYALTY=2;Sorin, Vengeful Bloodlord|Counters:LOYALTY=2 +humanprecast=Smothering Tithe:TrigToken;Smothering Tithe:TrigToken;Smothering Tithe:TrigToken;Smothering Tithe:TrigToken