From ac763262d92cf9496a7b4503edceaebf5df4a018 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Sat, 22 Sep 2018 18:21:15 +0000 Subject: [PATCH 01/39] Copy standardization (M19) --- forge-gui/res/cardsfolder/a/artisan_of_forms.txt | 4 ++-- forge-gui/res/cardsfolder/c/cemetery_puca.txt | 6 +++--- forge-gui/res/cardsfolder/d/dacks_duplicate.txt | 4 ++-- forge-gui/res/cardsfolder/d/dimir_doppelganger.txt | 6 +++--- forge-gui/res/cardsfolder/e/evil_twin.txt | 4 ++-- forge-gui/res/cardsfolder/g/gigantoplasm.txt | 4 ++-- forge-gui/res/cardsfolder/h/heat_shimmer.txt | 4 ++-- forge-gui/res/cardsfolder/k/kiki_jiki_mirror_breaker.txt | 4 ++-- forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt | 6 +++--- forge-gui/res/cardsfolder/m/mercurial_pretender.txt | 4 ++-- forge-gui/res/cardsfolder/m/minion_reflector.txt | 4 ++-- forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt | 6 +++--- forge-gui/res/cardsfolder/p/phantasmal_image.txt | 4 ++-- forge-gui/res/cardsfolder/p/progenitor_mimic.txt | 4 ++-- forge-gui/res/cardsfolder/s/sakashima_the_impostor.txt | 4 ++-- forge-gui/res/cardsfolder/s/splinter_twin.txt | 6 +++--- forge-gui/res/cardsfolder/t/thespians_stage.txt | 6 +++--- forge-gui/res/cardsfolder/t/twinflame.txt | 4 ++-- forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt | 6 +++--- forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt | 6 +++--- forge-gui/res/cardsfolder/v/vesuvan_shapeshifter.txt | 6 +++--- 21 files changed, 51 insertions(+), 51 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/artisan_of_forms.txt b/forge-gui/res/cardsfolder/a/artisan_of_forms.txt index 2f6cc398319..c26fd89b04e 100644 --- a/forge-gui/res/cardsfolder/a/artisan_of_forms.txt +++ b/forge-gui/res/cardsfolder/a/artisan_of_forms.txt @@ -2,9 +2,9 @@ Name:Artisan of Forms ManaCost:1 U Types:Creature Human Wizard PT:1/1 -T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigArtisanCopy | TriggerDescription$ Heroic — Whenever you cast a spell that targets CARDNAME, you may have CARDNAME become a copy of target creature and gain this ability. +T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigArtisanCopy | TriggerDescription$ Heroic — Whenever you cast a spell that targets CARDNAME, you may have CARDNAME become a copy of target creature, except it has this ability. SVar:TrigArtisanCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy | Optional$ True | AddTriggers$ ArtisanHeroicTrig | AddSVars$ TrigArtisanCopy,ArtisanHeroicTrig SVar:ArtisanHeroicTrig:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigArtisanCopy | TriggerDescription$ Heroic — Whenever you cast a spell that targets CARDNAME, you may have CARDNAME become a copy of target creature and gain this ability. SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/artisan_of_forms.jpg -Oracle:Heroic — Whenever you cast a spell that targets Artisan of Forms, you may have Artisan of Forms become a copy of target creature and gain this ability. +Oracle:Heroic — Whenever you cast a spell that targets Artisan of Forms, you may have Artisan of Forms become a copy of target creature, except it has this ability. diff --git a/forge-gui/res/cardsfolder/c/cemetery_puca.txt b/forge-gui/res/cardsfolder/c/cemetery_puca.txt index 4d7ca05cb20..74c68cd07ee 100644 --- a/forge-gui/res/cardsfolder/c/cemetery_puca.txt +++ b/forge-gui/res/cardsfolder/c/cemetery_puca.txt @@ -3,9 +3,9 @@ ManaCost:1 UB UB Types:Creature Shapeshifter PT:1/2 # Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ CemeteryPucaCopy | TriggerDescription$ Whenever a creature dies, you may pay {1}. If you do, CARDNAME becomes a copy of that creature and gains this ability. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ CemeteryPucaCopy | TriggerDescription$ Whenever a creature dies, you may pay {1}. If you do, CARDNAME becomes a copy of that creature, except it has this ability. SVar:CemeteryPucaCopy:AB$ Clone | Cost$ 1 | Defined$ TriggeredCardLKICopy | AddTriggers$ CemeteryPucaDiesTrig | AddSVars$ CemeteryPucaCopy,CemeteryPucaDiesTrig -SVar:CemeteryPucaDiesTrig:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ CemeteryPucaCopy | TriggerDescription$ Whenever a creature dies, you may pay {1}. If you do, CARDNAME becomes a copy of that creature and gains this ability. +SVar:CemeteryPucaDiesTrig:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ CemeteryPucaCopy | TriggerDescription$ Whenever a creature dies, you may pay {1}. If you do, CARDNAME becomes a copy of that creature, except it has this ability. SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/cemetery_puca.jpg -Oracle:Whenever a creature dies, you may pay {1}. If you do, Cemetery Puca becomes a copy of that creature and gains this ability. +Oracle:Whenever a creature dies, you may pay {1}. If you do, Cemetery Puca becomes a copy of that creature, except it has this ability. diff --git a/forge-gui/res/cardsfolder/d/dacks_duplicate.txt b/forge-gui/res/cardsfolder/d/dacks_duplicate.txt index ce5cd483f24..8cf010a908b 100644 --- a/forge-gui/res/cardsfolder/d/dacks_duplicate.txt +++ b/forge-gui/res/cardsfolder/d/dacks_duplicate.txt @@ -3,6 +3,6 @@ ManaCost:2 U R Types:Creature Shapeshifter PT:0/0 K:ETBReplacement:Copy:DBCopy:Optional -SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddKeywords$ Haste & Dethrone | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield except it gains haste and dethrone. (Whenever it attacks the player with the most life or tied for most life, put a +1/+1 counter on it.) +SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddKeywords$ Haste & Dethrone | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it has haste and dethrone. (Whenever it attacks the player with the most life or tied for most life, put a +1/+1 counter on it.) SVar:Picture:http://www.wizards.com/global/images/magic/general/dacks_duplicate.jpg -Oracle:You may have Dack's Duplicate enter the battlefield as a copy of any creature on the battlefield except it gains haste and dethrone. (Whenever it attacks the player with the most life or tied for most life, put a +1/+1 counter on it.) +Oracle:You may have Dack's Duplicate enter the battlefield as a copy of any creature on the battlefield, except it has haste and dethrone. (Whenever it attacks the player with the most life or tied for most life, put a +1/+1 counter on it.) diff --git a/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt b/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt index c8b7f3799a0..933c2d2d587 100644 --- a/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt +++ b/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt @@ -3,9 +3,9 @@ ManaCost:1 U B Types:Creature Shapeshifter PT:0/2 # Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone -A:AB$ ChangeZone | Cost$ 1 U B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DDCopy | SpellDescription$ Exile target creature card from a graveyard. CARDNAME becomes a copy of that card and gains this ability. +A:AB$ ChangeZone | Cost$ 1 U B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DDCopy | SpellDescription$ Exile target creature card from a graveyard. CARDNAME becomes a copy of that card, except it has this ability. SVar:DDCopy:DB$ Clone | Defined$ Remembered | AddAbilities$ DDAbility | AddSVars$ DDAbility,DDCopy -SVar:DDAbility:AB$ ChangeZone | Cost$ 1 U B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DDCopy | SpellDescription$ Exile target creature card from a graveyard. CARDNAME becomes a copy of that card and gains this ability. +SVar:DDAbility:AB$ ChangeZone | Cost$ 1 U B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DDCopy | SpellDescription$ Exile target creature card from a graveyard. CARDNAME becomes a copy of that card, except it has this ability. SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_doppelganger.jpg -Oracle:{1}{U}{B}: Exile target creature card from a graveyard. Dimir Doppelganger becomes a copy of that card and gains this ability. +Oracle:{1}{U}{B}: Exile target creature card from a graveyard. Dimir Doppelganger becomes a copy of that card, except it has this ability. diff --git a/forge-gui/res/cardsfolder/e/evil_twin.txt b/forge-gui/res/cardsfolder/e/evil_twin.txt index bf5228f1a30..d191799c52b 100644 --- a/forge-gui/res/cardsfolder/e/evil_twin.txt +++ b/forge-gui/res/cardsfolder/e/evil_twin.txt @@ -4,8 +4,8 @@ Types:Creature Shapeshifter PT:0/0 # Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone K:ETBReplacement:Copy:ChooseCreature:Optional -SVar:ChooseCreature:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True | AILogic$ AtLeast1 | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it gains "{U}{B}, {T}: Destroy target creature with the same name as this creature." +SVar:ChooseCreature:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True | AILogic$ AtLeast1 | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it has "{U}{B}, {T}: Destroy target creature with the same name as this creature." SVar:DBCopy:DB$ Clone | Defined$ Remembered | AddAbilities$ EvilTwin SVar:EvilTwin:AB$Destroy | Cost$ U B T | ValidTgts$ Creature.sameName | TgtPrompt$ Select target creature with the same name. | SpellDescription$ Destroy target creature with the same name as this creature. SVar:Picture:http://www.wizards.com/global/images/magic/general/evil_twin.jpg -Oracle:You may have Evil Twin enter the battlefield as a copy of any creature on the battlefield, except it gains "{U}{B}, {T}: Destroy target creature with the same name as this creature." +Oracle:You may have Evil Twin enter the battlefield as a copy of any creature on the battlefield, except it has "{U}{B}, {T}: Destroy target creature with the same name as this creature." diff --git a/forge-gui/res/cardsfolder/g/gigantoplasm.txt b/forge-gui/res/cardsfolder/g/gigantoplasm.txt index eea8196c8c6..73733579483 100644 --- a/forge-gui/res/cardsfolder/g/gigantoplasm.txt +++ b/forge-gui/res/cardsfolder/g/gigantoplasm.txt @@ -3,8 +3,8 @@ ManaCost:3 U Types:Creature Shapeshifter PT:0/0 K:ETBReplacement:Copy:DBCopy:Optional -SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddAbilities$ Gigantoplasm | AddSVars$ X | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield except it gains "{X}: This creature has base power and toughness of X/X." +SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddAbilities$ Gigantoplasm | AddSVars$ X | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it has "{X}: This creature has base power and toughness of X/X." SVar:Gigantoplasm:AB$ Animate | Cost$ X | Power$ X | Toughness$ X | References$ X | ValidCards$ Self | Permanent$ True | SpellDescription$ CARDNAME has base power and toughness of X/X. SVar:X:Count$xPaid SVar:Picture:http://www.wizards.com/global/images/magic/general/gigantoplasm.jpg -Oracle:You may have Gigantoplasm enter the battlefield as a copy of any creature on the battlefield except it gains "{X}: This creature has base power and toughness X/X." +Oracle:You may have Gigantoplasm enter the battlefield as a copy of any creature on the battlefield, except it has "{X}: This creature has base power and toughness X/X." diff --git a/forge-gui/res/cardsfolder/h/heat_shimmer.txt b/forge-gui/res/cardsfolder/h/heat_shimmer.txt index b7a36237813..800c8118b9c 100644 --- a/forge-gui/res/cardsfolder/h/heat_shimmer.txt +++ b/forge-gui/res/cardsfolder/h/heat_shimmer.txt @@ -1,7 +1,7 @@ Name:Heat Shimmer ManaCost:2 R Types:Sorcery -A:SP$ CopyPermanent | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Haste | AtEOTTrig$ Exile | AddSVars$ SneakAttackEOT | SpellDescription$ Create a token that's a copy of target creature. That token has haste and "At the beginning of the end step, exile this permanent." +A:SP$ CopyPermanent | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Haste | AtEOTTrig$ Exile | AddSVars$ SneakAttackEOT | SpellDescription$ Create a token that's a copy of target creature, except it has haste and "At the beginning of the end step, exile this permanent." SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/heat_shimmer.jpg -Oracle:Create a token that's a copy of target creature. That token has haste and "At the beginning of the end step, exile this permanent." +Oracle:Create a token that's a copy of target creature, except it has haste and "At the beginning of the end step, exile this permanent." diff --git a/forge-gui/res/cardsfolder/k/kiki_jiki_mirror_breaker.txt b/forge-gui/res/cardsfolder/k/kiki_jiki_mirror_breaker.txt index 64e236fa3d0..8870e49d172 100644 --- a/forge-gui/res/cardsfolder/k/kiki_jiki_mirror_breaker.txt +++ b/forge-gui/res/cardsfolder/k/kiki_jiki_mirror_breaker.txt @@ -3,7 +3,7 @@ ManaCost:2 R R R Types:Legendary Creature Goblin Shaman PT:2/2 K:Haste -A:AB$ CopyPermanent | Cost$ T | ValidTgts$ Creature.nonLegendary+YouCtrl | TgtPrompt$ Select target nonlegendary creature you control | Keywords$ Haste | AtEOT$ Sacrifice | AddSVars$ SneakAttackEOT | SpellDescription$ Create a token that's a copy of target nonlegendary creature you control. That token has haste. Sacrifice it at the beginning of the next end step. +A:AB$ CopyPermanent | Cost$ T | ValidTgts$ Creature.nonLegendary+YouCtrl | TgtPrompt$ Select target nonlegendary creature you control | Keywords$ Haste | AtEOT$ Sacrifice | AddSVars$ SneakAttackEOT | SpellDescription$ Create a token that's a copy of target nonlegendary creature you control, except it has haste. Sacrifice it at the beginning of the next end step. SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card50321.jpg -Oracle:Haste\n{T}: Create a token that's a copy of target nonlegendary creature you control. That token has haste. Sacrifice it at the beginning of the next end step. +Oracle:Haste\n{T}: Create a token that's a copy of target nonlegendary creature you control, except it has haste. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt b/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt index 547047a35a0..d5381baa0ce 100644 --- a/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt +++ b/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt @@ -3,9 +3,9 @@ ManaCost:U U B B Types:Legendary Creature Shapeshifter PT:3/3 K:Hexproof -T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.nonToken+OppOwn | TriggerZones$ Battlefield | Execute$ LazavCopy | OptionalDecider$ You | TriggerDescription$ Whenever a creature card is put into an opponent's graveyard from anywhere, you may have CARDNAME become a copy of that card except it's name is still CARDNAME, it's legendary in addition to it's other types, and it gains hexproof and this ability. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.nonToken+OppOwn | TriggerZones$ Battlefield | Execute$ LazavCopy | OptionalDecider$ You | TriggerDescription$ Whenever a creature card is put into an opponent's graveyard from anywhere, you may have CARDNAME become a copy of that card except it's name is still CARDNAME, it's legendary in addition to it's other types, and it has hexproof and this ability. SVar:LazavCopy:DB$ Clone | Defined$ TriggeredCard | KeepName$ True | AddTypes$ Legendary | AddTriggers$ LazavTrig | AddKeywords$ Hexproof | AddSVars$ LazavCopy,LazavTrig -SVar:LazavTrig:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.OppOwn | TriggerZones$ Battlefield | Execute$ LazavCopy | OptionalDecider$ You | TriggerDescription$ Whenever a creature card is put into an opponent's graveyard from anywhere, you may have CARDNAME become a copy of that card except it's name is still CARDNAME, it's legendary in addition to it's other types, and it gains hexproof and this ability. +SVar:LazavTrig:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.OppOwn | TriggerZones$ Battlefield | Execute$ LazavCopy | OptionalDecider$ You | TriggerDescription$ Whenever a creature card is put into an opponent's graveyard from anywhere, you may have CARDNAME become a copy of that card except it's name is still CARDNAME, it's legendary in addition to it's other types, and it has hexproof and this ability. SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/lazav_dimir_mastermind.jpg -Oracle:Hexproof\nWhenever a creature card is put into an opponent's graveyard from anywhere, you may have Lazav, Dimir Mastermind become a copy of that card except its name is still Lazav, Dimir Mastermind, it's legendary in addition to its other types, and it gains hexproof and this ability. +Oracle:Hexproof\nWhenever a creature card is put into an opponent's graveyard from anywhere, you may have Lazav, Dimir Mastermind become a copy of that card except its name is still Lazav, Dimir Mastermind, it's legendary in addition to its other types, and it has hexproof and this ability. diff --git a/forge-gui/res/cardsfolder/m/mercurial_pretender.txt b/forge-gui/res/cardsfolder/m/mercurial_pretender.txt index c6e48a645d5..426f1da5e9e 100644 --- a/forge-gui/res/cardsfolder/m/mercurial_pretender.txt +++ b/forge-gui/res/cardsfolder/m/mercurial_pretender.txt @@ -3,7 +3,7 @@ ManaCost:4 U Types:Creature Shapeshifter PT:0/0 K:ETBReplacement:Copy:DBCopy:Optional -SVar:DBCopy:DB$ Clone | Choices$ Creature.YouCtrl+Other | AddAbilities$ MercurialBounce | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature you control except it gains "{2}{U}{U}: Return this creature to its owner's hand." +SVar:DBCopy:DB$ Clone | Choices$ Creature.YouCtrl+Other | AddAbilities$ MercurialBounce | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature you control, except it has "{2}{U}{U}: Return this creature to its owner's hand." SVar:MercurialBounce:AB$ ChangeZone | Cost$ 2 U U | Defined$ Self | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. SVar:Picture:http://www.wizards.com/global/images/magic/general/mercurial_pretender.jpg -Oracle:You may have Mercurial Pretender enter the battlefield as a copy of any creature you control except it gains "{2}{U}{U}: Return this creature to its owner's hand." +Oracle:You may have Mercurial Pretender enter the battlefield as a copy of any creature you control, except it has "{2}{U}{U}: Return this creature to its owner's hand." diff --git a/forge-gui/res/cardsfolder/m/minion_reflector.txt b/forge-gui/res/cardsfolder/m/minion_reflector.txt index 4b6233ffe03..c896b4f4a05 100644 --- a/forge-gui/res/cardsfolder/m/minion_reflector.txt +++ b/forge-gui/res/cardsfolder/m/minion_reflector.txt @@ -1,9 +1,9 @@ Name:Minion Reflector ManaCost:5 Types:Artifact -T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigCopy | OptionalDecider$ You | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature. That token has haste and "At the beginning of the end step, sacrifice this permanent." +T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigCopy | OptionalDecider$ You | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature, except it has haste and "At the beginning of the end step, sacrifice this permanent." SVar:TrigCopy:AB$ CopyPermanent | Cost$ 2 | Defined$ TriggeredCard | Keywords$ Haste | AddSVars$ SneakAttackEOT | AtEOTTrig$ Sacrifice SVar:BuffedBy:Creature SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/minion_reflector.jpg -Oracle:Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature. That token has haste and "At the beginning of the end step, sacrifice this permanent." +Oracle:Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature, except it has haste and "At the beginning of the end step, sacrifice this permanent." diff --git a/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt b/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt index 0888a589650..a8c406005d0 100644 --- a/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt +++ b/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt @@ -2,8 +2,8 @@ Name:Mizzium Transreliquat ManaCost:3 Types:Artifact A:AB$ Clone | Cost$ 3 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to copy until end of turn. | Duration$ UntilEndOfTurn | SpellDescription$ CARDNAME becomes a copy of target artifact until end of turn. -A:AB$ Clone | Cost$ 1 U R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to copy. | AddAbilities$ MizzCopy | AddSVars$ MizzCopy | SpellDescription$ CARDNAME becomes a copy of target artifact and gains this ability. -SVar:MizzCopy:AB$ Clone | Cost$ 1 U R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to copy. | AddAbilities$ MizzCopy | AddSVars$ MizzCopy | SpellDescription$ CARDNAME becomes a copy of target artifact and gains this ability. +A:AB$ Clone | Cost$ 1 U R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to copy. | AddAbilities$ MizzCopy | AddSVars$ MizzCopy | SpellDescription$ CARDNAME becomes a copy of target artifact, except it has this ability. +SVar:MizzCopy:AB$ Clone | Cost$ 1 U R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to copy. | AddAbilities$ MizzCopy | AddSVars$ MizzCopy | SpellDescription$ CARDNAME becomes a copy of target artifact, except it has this ability. SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mizzium_transreliquat.jpg -Oracle:{3}: Mizzium Transreliquat becomes a copy of target artifact until end of turn.\n{1}{U}{R}: Mizzium Transreliquat becomes a copy of target artifact and gains this ability. +Oracle:{3}: Mizzium Transreliquat becomes a copy of target artifact until end of turn.\n{1}{U}{R}: Mizzium Transreliquat becomes a copy of target artifact, except it has this ability. diff --git a/forge-gui/res/cardsfolder/p/phantasmal_image.txt b/forge-gui/res/cardsfolder/p/phantasmal_image.txt index 7c110e6016e..b3a4f808c9b 100644 --- a/forge-gui/res/cardsfolder/p/phantasmal_image.txt +++ b/forge-gui/res/cardsfolder/p/phantasmal_image.txt @@ -4,9 +4,9 @@ Types:Creature Illusion PT:0/0 # Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone K:ETBReplacement:Copy:DBCopy:Optional -SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTypes$ Illusion | AddTriggers$ PhantasmalImageTgtTrig | AddSVars$ PhantasmalImageSac,Targeting | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it gains "When this creature becomes the target of a spell or ability, sacrifice it." +SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTypes$ Illusion | AddTriggers$ PhantasmalImageTgtTrig | AddSVars$ PhantasmalImageSac,Targeting | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it has "When this creature becomes the target of a spell or ability, sacrifice it." SVar:PhantasmalImageTgtTrig:Mode$ BecomesTarget | ValidTarget$ Card.Self | Execute$ PhantasmalImageSac | TriggerDescription$ When this creature becomes the target of a spell or ability, sacrifice it. SVar:PhantasmalImageSac:DB$Sacrifice | Defined$ Self SVar:Targeting:Dies SVar:Picture:http://www.wizards.com/global/images/magic/general/phantasmal_image.jpg -Oracle:You may have Phantasmal Image enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it gains "When this creature becomes the target of a spell or ability, sacrifice it." +Oracle:You may have Phantasmal Image enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it has "When this creature becomes the target of a spell or ability, sacrifice it." diff --git a/forge-gui/res/cardsfolder/p/progenitor_mimic.txt b/forge-gui/res/cardsfolder/p/progenitor_mimic.txt index 19553c0e0ed..36d8322352b 100644 --- a/forge-gui/res/cardsfolder/p/progenitor_mimic.txt +++ b/forge-gui/res/cardsfolder/p/progenitor_mimic.txt @@ -3,9 +3,9 @@ ManaCost:4 G U Types:Creature Shapeshifter PT:0/0 K:ETBReplacement:Copy:DBCopy:Optional -SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTriggers$ ProgenitorTrig | AddSVars$ ProgenitorCopy,ProgenitorTrig | SpellDescription$ You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield, except it gains "At the beginning of your upkeep, if this creature isn't a token, create a token that's a copy of this creature." +SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTriggers$ ProgenitorTrig | AddSVars$ ProgenitorCopy,ProgenitorTrig | SpellDescription$ You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield, except it has "At the beginning of your upkeep, if this creature isn't a token, create a token that's a copy of this creature." SVar:ProgenitorTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ ProgenitorCopy | IsPresent$ Card.Self+nonToken | TriggerDescription$ At the beginning of your upkeep, if CARDNAME isn't a token, create a token that's a copy of CARDNAME." SVar:ProgenitorCopy:DB$ CopyPermanent | Defined$ Self | NumCopies$ 1 SVar:NeedsToPlay:Creature.inZoneBattlefield SVar:Picture:http://www.wizards.com/global/images/magic/general/progenitor_mimic.jpg -Oracle:You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield, except it gains "At the beginning of your upkeep, if this creature isn't a token, create a token that's a copy of this creature." +Oracle:You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield, except it has "At the beginning of your upkeep, if this creature isn't a token, create a token that's a copy of this creature." diff --git a/forge-gui/res/cardsfolder/s/sakashima_the_impostor.txt b/forge-gui/res/cardsfolder/s/sakashima_the_impostor.txt index db012d45c58..0c0c95d263a 100644 --- a/forge-gui/res/cardsfolder/s/sakashima_the_impostor.txt +++ b/forge-gui/res/cardsfolder/s/sakashima_the_impostor.txt @@ -4,8 +4,8 @@ Types:Legendary Creature Human Rogue PT:3/1 # Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone K:ETBReplacement:Copy:DBCopy:Optional -SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | KeepName$ True | AddTypes$ Legendary | AddAbilities$ ReturnSakashima | AddSVars$ TrigReturnSak | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except its name is still CARDNAME, it's legendary in addition to its other types, and it gains "{2}{U}{U}: Return CARDNAME to its owner's hand at the beginning of the next end step." +SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | KeepName$ True | AddTypes$ Legendary | AddAbilities$ ReturnSakashima | AddSVars$ TrigReturnSak | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except its name is still CARDNAME, it's legendary in addition to its other types, except it has "{2}{U}{U}: Return CARDNAME to its owner's hand at the beginning of the next end step." SVar:ReturnSakashima:AB$ DelayedTrigger | Cost$ 2 U U | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturnSak | SpellDescription$ Return CARDNAME to it's owners hand at the beginning of the next end step. SVar:TrigReturnSak:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Hand SVar:Picture:http://www.wizards.com/global/images/magic/general/sakashima_the_impostor.jpg -Oracle:You may have Sakashima the Impostor enter the battlefield as a copy of any creature on the battlefield, except its name is still Sakashima the Impostor, it's legendary in addition to its other types, and it gains "{2}{U}{U}: Return Sakashima the Impostor to its owner's hand at the beginning of the next end step." +Oracle:You may have Sakashima the Impostor enter the battlefield as a copy of any creature on the battlefield, except its name is still Sakashima the Impostor, it's legendary in addition to its other types, except it has "{2}{U}{U}: Return Sakashima the Impostor to its owner's hand at the beginning of the next end step." diff --git a/forge-gui/res/cardsfolder/s/splinter_twin.txt b/forge-gui/res/cardsfolder/s/splinter_twin.txt index dcdd920ef7c..01df38a9435 100644 --- a/forge-gui/res/cardsfolder/s/splinter_twin.txt +++ b/forge-gui/res/cardsfolder/s/splinter_twin.txt @@ -3,9 +3,9 @@ ManaCost:2 R R Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 2 R R | ValidTgts$ Creature | AILogic$ Pump -S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ ABCopy | Description$ Enchanted creature has "{T}: Create a token that's a copy of this creature. That token has haste. Exile it at the beginning of the next end step." -SVar:ABCopy:AB$ CopyPermanent | Cost$ T | Defined$ Self | Keywords$ Haste | AtEOT$ Exile | AddSVars$ SneakAttackEOT | SpellDescription$ Create a token that's a copy of this creature. That token has haste. Exile it at the beginning of the next end step. +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ ABCopy | Description$ Enchanted creature has "{T}: Create a token that's a copy of this creature, except it has haste. Exile that token at the beginning of the next end step." +SVar:ABCopy:AB$ CopyPermanent | Cost$ T | Defined$ Self | Keywords$ Haste | AtEOT$ Exile | AddSVars$ SneakAttackEOT | SpellDescription$ Create a token that's a copy of this creature, except it has haste. Exile that token at the beginning of the next end step. SVar:NonStackingAttachEffect:True SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/splinter_twin.jpg -Oracle:Enchant creature\nEnchanted creature has "{T}: Create a token that's a copy of this creature. That token has haste. Exile it at the beginning of the next end step." +Oracle:Enchant creature\nEnchanted creature has "{T}: Create a token that's a copy of this creature, except it has haste. Exile that token at the beginning of the next end step." diff --git a/forge-gui/res/cardsfolder/t/thespians_stage.txt b/forge-gui/res/cardsfolder/t/thespians_stage.txt index e6673ff8a1d..a6ed17eb256 100644 --- a/forge-gui/res/cardsfolder/t/thespians_stage.txt +++ b/forge-gui/res/cardsfolder/t/thespians_stage.txt @@ -2,8 +2,8 @@ Name:Thespian's Stage ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. -A:AB$ Clone | Cost$ 2 T | ValidTgts$ Land | TgtPrompt$ Select target land to copy. | AddAbilities$ ThespianCopy | AddSVars$ ThespianCopy | SpellDescription$ CARDNAME becomes a copy of target land and gains this ability. -SVar:ThespianCopy:AB$ Clone | Cost$ 2 T | ValidTgts$ Land | TgtPrompt$ Select target land to copy. | AddAbilities$ ThespianCopy | AddSVars$ ThespianCopy | SpellDescription$ CARDNAME becomes a copy of target land and gains this ability. +A:AB$ Clone | Cost$ 2 T | ValidTgts$ Land | TgtPrompt$ Select target land to copy. | AddAbilities$ ThespianCopy | AddSVars$ ThespianCopy | SpellDescription$ CARDNAME becomes a copy of target land, except it has this ability. +SVar:ThespianCopy:AB$ Clone | Cost$ 2 T | ValidTgts$ Land | TgtPrompt$ Select target land to copy. | AddAbilities$ ThespianCopy | AddSVars$ ThespianCopy | SpellDescription$ CARDNAME becomes a copy of target land, except it has this ability. SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/thespians_stage.jpg -Oracle:{T}: Add {C}.\n{2}, {T}: Thespian's Stage becomes a copy of target land and gains this ability. +Oracle:{T}: Add {C}.\n{2}, {T}: Thespian's Stage becomes a copy of target land, except it has this ability. diff --git a/forge-gui/res/cardsfolder/t/twinflame.txt b/forge-gui/res/cardsfolder/t/twinflame.txt index fdc16a42147..6999dd96f12 100644 --- a/forge-gui/res/cardsfolder/t/twinflame.txt +++ b/forge-gui/res/cardsfolder/t/twinflame.txt @@ -2,8 +2,8 @@ Name:Twinflame ManaCost:1 R Types:Sorcery K:Strive:2 R -A:SP$ CopyPermanent | Cost$ 1 R | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | TargetMin$ 0 | TargetMax$ MaxTargets | Keywords$ Haste | AtEOT$ Exile | AddSVars$ SneakAttackEOT | References$ MaxTargets | SpellDescription$ Choose any number of target creatures you control. For each of them, create a token that's a copy of that creature. Those tokens have haste. Exile them at the beginning of the next end step. +A:SP$ CopyPermanent | Cost$ 1 R | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | TargetMin$ 0 | TargetMax$ MaxTargets | Keywords$ Haste | AtEOT$ Exile | AddSVars$ SneakAttackEOT | References$ MaxTargets | SpellDescription$ Choose any number of target creatures you control. For each of them, create a token that's a copy of that creature, except it has haste. Exile those tokens at the beginning of the next end step. SVar:MaxTargets:Count$Valid Creature.YouCtrl SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/twinflame.jpg -Oracle:Strive — Twinflame costs {2}{R} more to cast for each target beyond the first.\nChoose any number of target creatures you control. For each of them, create a token that's a copy of that creature. Those tokens have haste. Exile them at the beginning of the next end step. +Oracle:Strive — Twinflame costs {2}{R} more to cast for each target beyond the first.\nChoose any number of target creatures you control. For each of them, create a token that's a copy of that creature, except it has haste. Exile those tokens at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt b/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt index af412f12b6b..3ae69286e23 100644 --- a/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt +++ b/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt @@ -3,8 +3,8 @@ ManaCost:3 U Types:Creature Shapeshifter PT:0/1 # Make SVars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ USCopy | TriggerDescription$ Whenever another creature enters the battlefield, CARDNAME becomes a copy of that creature and gains this ability. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ USCopy | TriggerDescription$ Whenever another creature enters the battlefield, CARDNAME becomes a copy of that creature, except it has this ability. SVar:USCopy:DB$ Clone | Defined$ TriggeredCard | AddTriggers$ USTrig | AddSVars$ USCopy,USTrig -SVar:USTrig:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ USCopy | TriggerDescription$ Whenever another creature enters the battlefield, CARDNAME becomes a copy of that creature and gains this ability. +SVar:USTrig:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ USCopy | TriggerDescription$ Whenever another creature enters the battlefield, CARDNAME becomes a copy of that creature, except it has this ability. SVar:Picture:http://www.wizards.com/global/images/magic/general/unstable_shapeshifter.jpg -Oracle:Whenever another creature enters the battlefield, Unstable Shapeshifter becomes a copy of that creature and gains this ability. +Oracle:Whenever another creature enters the battlefield, Unstable Shapeshifter becomes a copy of that creature, except it has this ability. diff --git a/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt b/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt index 2b6a6aba2b3..c7c4baed72a 100644 --- a/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt +++ b/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt @@ -4,10 +4,10 @@ Types:Creature Shapeshifter PT:0/0 # Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone K:ETBReplacement:Copy:ChooseCreature:Optional -SVar:ChooseCreature:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True | AILogic$ Clone | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield except it doesn't copy that creature's color and it gains "At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability." +SVar:ChooseCreature:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True | AILogic$ Clone | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it doesn't copy that creature's color and it has "At the beginning of your upkeep, you may have this creature become a copy of target creature, except it doesn't copy that creature's color and it has this ability." SVar:DBCopy:DB$ Clone | Defined$ Remembered | Colors$ Blue | OverwriteColors$ True | AddTriggers$ VesDopUpkeepTrig | AddSVars$ VesDopCopy,VesDopUpkeepTrig -SVar:VesDopUpkeepTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ VesDopCopy | TriggerDescription$ At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability. +SVar:VesDopUpkeepTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ VesDopCopy | TriggerDescription$ At the beginning of your upkeep, you may have this creature become a copy of target creature, except it doesn't copy that creature's color and it has this ability. SVar:VesDopCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy. | Optional$ True | Colors$ Blue | OverwriteColors$ True | AddTriggers$ VesDopUpkeepTrig | AddSVars$ VesDopCopy,VesDopUpkeepTrig | SubAbility$ DBCleanup SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/vesuvan_doppelganger.jpg -Oracle:You may have Vesuvan Doppelganger enter the battlefield as a copy of any creature on the battlefield except it doesn't copy that creature's color and it gains "At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability." +Oracle:You may have Vesuvan Doppelganger enter the battlefield as a copy of any creature on the battlefield, except it doesn't copy that creature's color and it has "At the beginning of your upkeep, you may have this creature become a copy of target creature, except it doesn't copy that creature's color and it has this ability." diff --git a/forge-gui/res/cardsfolder/v/vesuvan_shapeshifter.txt b/forge-gui/res/cardsfolder/v/vesuvan_shapeshifter.txt index 14af6bc37b7..620a1ffac20 100644 --- a/forge-gui/res/cardsfolder/v/vesuvan_shapeshifter.txt +++ b/forge-gui/res/cardsfolder/v/vesuvan_shapeshifter.txt @@ -5,10 +5,10 @@ PT:0/0 K:Morph:1 U K:ETBReplacement:Copy:ChooseCreature:Optional # Make SVars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone -SVar:ChooseCreature:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | AILogic$ Clone | RememberChosen$ True | SpellDescription$ As CARDNAME enters the battlefield or is turned face up, you may choose another creature on the battlefield. If you do, until CARDNAME is turned face down, it becomes a copy of that creature and gains "At the beginning of your upkeep, you may turn this creature face down." +SVar:ChooseCreature:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | AILogic$ Clone | RememberChosen$ True | SpellDescription$ As CARDNAME enters the battlefield or is turned face up, you may choose another creature on the battlefield. If you do, until CARDNAME is turned face down, it becomes a copy of that creature, except it has "At the beginning of your upkeep, you may turn this creature face down." SVar:DBCopy:DB$ Clone | Defined$ Remembered | AddTriggers$ VesShapeUpkeepTrig | AddSVars$ VesShapeTurn,VesShapeUpkeepTrig SVar:VesShapeUpkeepTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ VesShapeTurn | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may turn CARDNAME face down. SVar:VesShapeTurn:DB$ SetState | Defined$ Self | Mode$ TurnFace | ResetClone$ True -R:Event$ TurnFaceUp | ValidCard$ Card.Self | Optional$ True | ReplaceWith$ ChooseCreature | ActiveZones$ Battlefield | Description$ As CARDNAME is turned face up, you may choose another creature on the battlefield. If you do, until CARDNAME is turned face down, it becomes a copy of that creature and gains "At the beginning of your upkeep, you may turn this creature face down." +R:Event$ TurnFaceUp | ValidCard$ Card.Self | Optional$ True | ReplaceWith$ ChooseCreature | ActiveZones$ Battlefield | Description$ As CARDNAME is turned face up, you may choose another creature on the battlefield. If you do, until CARDNAME is turned face down, it becomes a copy of that creature, except it has "At the beginning of your upkeep, you may turn this creature face down." SVar:Picture:http://www.wizards.com/global/images/magic/general/vesuvan_shapeshifter.jpg -Oracle:As Vesuvan Shapeshifter enters the battlefield or is turned face up, you may choose another creature on the battlefield. If you do, until Vesuvan Shapeshifter is turned face down, it becomes a copy of that creature and gains "At the beginning of your upkeep, you may turn this creature face down."\nMorph {1}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +Oracle:As Vesuvan Shapeshifter enters the battlefield or is turned face up, you may choose another creature on the battlefield. If you do, until Vesuvan Shapeshifter is turned face down, it becomes a copy of that creature, except it has "At the beginning of your upkeep, you may turn this creature face down."\nMorph {1}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) From 075efd3eb67b23bfdeb9db46df2356c359787c0c Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Sun, 23 Sep 2018 15:56:15 +0000 Subject: [PATCH 02/39] Increase Reduce Cardname (M19) --- forge-gui/res/cardsfolder/a/approach_of_the_second_sun.txt | 4 ++-- forge-gui/res/cardsfolder/c/cho_arrim_legate.txt | 4 ++-- forge-gui/res/cardsfolder/d/deepwood_legate.txt | 4 ++-- forge-gui/res/cardsfolder/i/increasing_ambition.txt | 4 ++-- forge-gui/res/cardsfolder/i/increasing_confusion.txt | 4 ++-- forge-gui/res/cardsfolder/i/increasing_devotion.txt | 4 ++-- forge-gui/res/cardsfolder/i/increasing_savagery.txt | 4 ++-- forge-gui/res/cardsfolder/i/increasing_vengeance.txt | 4 ++-- forge-gui/res/cardsfolder/k/kyren_legate.txt | 4 ++-- forge-gui/res/cardsfolder/m/massacre.txt | 4 ++-- forge-gui/res/cardsfolder/m/mogg_salvage.txt | 4 ++-- forge-gui/res/cardsfolder/p/patricians_scorn.txt | 4 ++-- forge-gui/res/cardsfolder/r/refreshing_rain.txt | 4 ++-- forge-gui/res/cardsfolder/r/rushwood_legate.txt | 4 ++-- forge-gui/res/cardsfolder/s/saprazzan_legate.txt | 4 ++-- forge-gui/res/cardsfolder/s/sivvis_ruse.txt | 4 ++-- forge-gui/res/cardsfolder/s/submerge.txt | 4 ++-- 17 files changed, 34 insertions(+), 34 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/approach_of_the_second_sun.txt b/forge-gui/res/cardsfolder/a/approach_of_the_second_sun.txt index 70d201f1af9..48c890acdfb 100644 --- a/forge-gui/res/cardsfolder/a/approach_of_the_second_sun.txt +++ b/forge-gui/res/cardsfolder/a/approach_of_the_second_sun.txt @@ -3,7 +3,7 @@ ManaCost:6 W Types:Sorcery T:Mode$ SpellCast | ValidCard$ Card.Self | Static$ True | Execute$ ApproachingSuns SVar:ApproachingSuns:DB$ Effect | Name$ ApproachingSuns | Duration$ Permanent -A:SP$ Branch | Cost$ 6 W | References$ X,Y,Z | BranchConditionSVar$ X | BranchConditionSVarCompare$ EQ3 | TrueSubAbility$ WinGame | FalseSubAbility$ GainLife | SpellDescription$ If CARDNAME was cast from your hand and you've cast another spell named Approach of the Second Sun this game, you win the game. Otherwise, put CARDNAME into its owner's library seventh from the top and you gain 7 life. +A:SP$ Branch | Cost$ 6 W | References$ X,Y,Z | BranchConditionSVar$ X | BranchConditionSVarCompare$ EQ3 | TrueSubAbility$ WinGame | FalseSubAbility$ GainLife | SpellDescription$ If this spell was cast from your hand and you've cast another spell named Approach of the Second Sun this game, you win the game. Otherwise, put CARDNAME into its owner's library seventh from the top and you gain 7 life. SVar:WinGame:DB$ WinsGame | Defined$ You SVar:GainLife:DB$ GainLife | LifeAmount$ 7 | Defined$ You | SubAbility$ Reapproach SVar:Reapproach:DB$ ChangeZone | Origin$ Stack | Destination$ Library | LibraryPosition$ 6 | Defined$ Self @@ -11,4 +11,4 @@ SVar:Y:Count$ValidCommand Effect.YouCtrl+namedApproachingSuns/LimitMax.2 SVar:Z:Count$ValidStack Card.wasCastFromHand+Self/LimitMax.1 SVar:X:SVar$Y/Plus.Z DeckNeeds:Name$Approach of the Second Sun -Oracle:If Approach of the Second Sun was cast from your hand and you've cast another spell named Approach of the Second Sun this game, you win the game. Otherwise, put Approach of the Second Sun into its owner's library seventh from the top and you gain 7 life. \ No newline at end of file +Oracle:If this spell was cast from your hand and you've cast another spell named Approach of the Second Sun this game, you win the game. Otherwise, put Approach of the Second Sun into its owner's library seventh from the top and you gain 7 life. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/cho_arrim_legate.txt b/forge-gui/res/cardsfolder/c/cho_arrim_legate.txt index 4dd663e25ce..66f35d47fb8 100644 --- a/forge-gui/res/cardsfolder/c/cho_arrim_legate.txt +++ b/forge-gui/res/cardsfolder/c/cho_arrim_legate.txt @@ -3,8 +3,8 @@ ManaCost:2 W Types:Creature Human Soldier PT:1/2 K:Protection from black -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Swamp and you control a Plains, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Swamp and you control a Plains, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Swamp.OppCtrl SVar:Y:Count$Valid Plains.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/cho_arrim_legate.jpg -Oracle:Protection from black\nIf an opponent controls a Swamp and you control a Plains, you may cast Cho-Arrim Legate without paying its mana cost. +Oracle:Protection from black\nIf an opponent controls a Swamp and you control a Plains, you may cast this spell without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/d/deepwood_legate.txt b/forge-gui/res/cardsfolder/d/deepwood_legate.txt index 48294e9cf39..45deb129a93 100644 --- a/forge-gui/res/cardsfolder/d/deepwood_legate.txt +++ b/forge-gui/res/cardsfolder/d/deepwood_legate.txt @@ -2,9 +2,9 @@ Name:Deepwood Legate ManaCost:3 B Types:Creature Shade PT:1/1 -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Forest and you control a Swamp, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Forest and you control a Swamp, you may cast this spell without paying its mana cost. A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. SVar:X:Count$Valid Forest.OppCtrl SVar:Y:Count$Valid Swamp.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/deepwood_legate.jpg -Oracle:If an opponent controls a Forest and you control a Swamp, you may cast Deepwood Legate without paying its mana cost.\n{B}: Deepwood Legate gets +1/+1 until end of turn. +Oracle:If an opponent controls a Forest and you control a Swamp, you may cast this spell without paying its mana cost.\n{B}: Deepwood Legate gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/i/increasing_ambition.txt b/forge-gui/res/cardsfolder/i/increasing_ambition.txt index 3d195b06464..9c0c4747b61 100644 --- a/forge-gui/res/cardsfolder/i/increasing_ambition.txt +++ b/forge-gui/res/cardsfolder/i/increasing_ambition.txt @@ -2,7 +2,7 @@ Name:Increasing Ambition ManaCost:4 B Types:Sorcery K:Flashback:7 B -A:SP$ ChangeZone | Cost$ 4 B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ X | Mandatory$ True | References$ X | SpellDescription$ Search your library for a card and put that card into your hand. If CARDNAME was cast from a graveyard, instead search your library for two cards and put them into your hand. Then shuffle your library. +A:SP$ ChangeZone | Cost$ 4 B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ X | Mandatory$ True | References$ X | SpellDescription$ Search your library for a card and put that card into your hand. If this spell was cast from a graveyard, instead search your library for two cards and put them into your hand. Then shuffle your library. SVar:X:Count$wasCastFromGraveyard.2.1 SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_ambition.jpg -Oracle:Search your library for a card and put that card into your hand. If Increasing Ambition was cast from a graveyard, instead search your library for two cards and put those cards into your hand. Then shuffle your library.\nFlashback {7}{B} (You may cast this card from your graveyard for its flashback cost. Then exile it.) +Oracle:Search your library for a card and put that card into your hand. If this spell was cast from a graveyard, instead search your library for two cards and put those cards into your hand. Then shuffle your library.\nFlashback {7}{B} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/i/increasing_confusion.txt b/forge-gui/res/cardsfolder/i/increasing_confusion.txt index 1dc02f5bbfc..76a7b09503e 100644 --- a/forge-gui/res/cardsfolder/i/increasing_confusion.txt +++ b/forge-gui/res/cardsfolder/i/increasing_confusion.txt @@ -2,9 +2,9 @@ Name:Increasing Confusion ManaCost:X U Types:Sorcery K:Flashback:X U -A:SP$ Mill | Cost$ X U | NumCards$ Z | ValidTgts$ Player | TgtPrompt$ Choose a player | References$ X,Y,Z | SpellDescription$ Target player puts the top X cards of their library into their graveyard. If CARDNAME was cast from a graveyard, that player puts twice as many cards into their graveyard instead. +A:SP$ Mill | Cost$ X U | NumCards$ Z | ValidTgts$ Player | TgtPrompt$ Choose a player | References$ X,Y,Z | SpellDescription$ Target player puts the top X cards of their library into their graveyard. If this spell was cast from a graveyard, that player puts twice as many cards into their graveyard instead. SVar:Z:SVar$X/Times.Y SVar:X:Count$xPaid SVar:Y:wasCastFromGraveyard.2.1 SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_confusion.jpg -Oracle:Target player puts the top X cards of their library into their graveyard. If Increasing Confusion was cast from a graveyard, that player puts twice that many cards into their graveyard instead.\nFlashback {X}{U} (You may cast this card from your graveyard for its flashback cost. Then exile it.) +Oracle:Target player puts the top X cards of their library into their graveyard. If this spell was cast from a graveyard, that player puts twice that many cards into their graveyard instead.\nFlashback {X}{U} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/i/increasing_devotion.txt b/forge-gui/res/cardsfolder/i/increasing_devotion.txt index 52432cafc0b..7dcd25fbcf0 100644 --- a/forge-gui/res/cardsfolder/i/increasing_devotion.txt +++ b/forge-gui/res/cardsfolder/i/increasing_devotion.txt @@ -2,7 +2,7 @@ Name:Increasing Devotion ManaCost:3 W W Types:Sorcery K:Flashback:7 W W -A:SP$ Token | Cost$ 3 W W | TokenAmount$ X | TokenName$ Human | TokenTypes$ Creature,Human | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ You | References$ X | SpellDescription$ Create five 1/1 white Human creature tokens. If CARDNAME was cast from a graveyard, create ten of those tokens instead. +A:SP$ Token | Cost$ 3 W W | TokenAmount$ X | TokenName$ Human | TokenTypes$ Creature,Human | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ You | References$ X | SpellDescription$ Create five 1/1 white Human creature tokens. If this spell was cast from a graveyard, create ten of those tokens instead. SVar:X:Count$wasCastFromGraveyard.10.5 SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_devotion.jpg -Oracle:Create five 1/1 white Human creature tokens. If Increasing Devotion was cast from a graveyard, create ten of those tokens instead.\nFlashback {7}{W}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.) +Oracle:Create five 1/1 white Human creature tokens. If this spell was cast from a graveyard, create ten of those tokens instead.\nFlashback {7}{W}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/i/increasing_savagery.txt b/forge-gui/res/cardsfolder/i/increasing_savagery.txt index 335714eb288..4eb9d8216b2 100644 --- a/forge-gui/res/cardsfolder/i/increasing_savagery.txt +++ b/forge-gui/res/cardsfolder/i/increasing_savagery.txt @@ -2,7 +2,7 @@ Name:Increasing Savagery ManaCost:2 G G Types:Sorcery K:Flashback:5 G G -A:SP$ PutCounter | Cost$ 2 G G | CounterNum$ X | CounterType$ P1P1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | References$ X | SpellDescription$ Put five +1/+1 counters on target creature. If CARDNAME was cast from a graveyard, put ten +1/+1 counters on that creature instead. +A:SP$ PutCounter | Cost$ 2 G G | CounterNum$ X | CounterType$ P1P1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | References$ X | SpellDescription$ Put five +1/+1 counters on target creature. If this spell was cast from a graveyard, put ten +1/+1 counters on that creature instead. SVar:X:Count$wasCastFromGraveyard.10.5 SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_savagery.jpg -Oracle:Put five +1/+1 counters on target creature. If Increasing Savagery was cast from a graveyard, put ten +1/+1 counters on that creature instead.\nFlashback {5}{G}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) +Oracle:Put five +1/+1 counters on target creature. If this spell was cast from a graveyard, put ten +1/+1 counters on that creature instead.\nFlashback {5}{G}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/i/increasing_vengeance.txt b/forge-gui/res/cardsfolder/i/increasing_vengeance.txt index 6964cc30425..c6e15bdc19a 100644 --- a/forge-gui/res/cardsfolder/i/increasing_vengeance.txt +++ b/forge-gui/res/cardsfolder/i/increasing_vengeance.txt @@ -2,9 +2,9 @@ Name:Increasing Vengeance ManaCost:R R Types:Instant K:Flashback:3 R R -A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | SubAbility$ DBCopy2 | SpellDescription$ Copy target instant or sorcery spell you control. If CARDNAME was cast from a graveyard, copy that spell twice instead. You may choose new targets for the copies. +A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | SubAbility$ DBCopy2 | SpellDescription$ Copy target instant or sorcery spell you control. If this spell was cast from a graveyard, copy that spell twice instead. You may choose new targets for the copies. SVar:DBCopy2:DB$ CopySpellAbility | Defined$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X SVar:X:Count$wasCastFromGraveyard.1.0 SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_vengeance.jpg -Oracle:Copy target instant or sorcery spell you control. If Increasing Vengeance was cast from a graveyard, copy that spell twice instead. You may choose new targets for the copies.\nFlashback {3}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) +Oracle:Copy target instant or sorcery spell you control. If this spell was cast from a graveyard, copy that spell twice instead. You may choose new targets for the copies.\nFlashback {3}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/k/kyren_legate.txt b/forge-gui/res/cardsfolder/k/kyren_legate.txt index f535099fa19..d9bb8b190ca 100644 --- a/forge-gui/res/cardsfolder/k/kyren_legate.txt +++ b/forge-gui/res/cardsfolder/k/kyren_legate.txt @@ -3,8 +3,8 @@ ManaCost:1 R Types:Creature Goblin PT:1/1 K:Haste -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Plains and you control a Mountain, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Plains and you control a Mountain, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Plains.OppCtrl SVar:Y:Count$Valid Mountain.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/kyren_legate.jpg -Oracle:Haste\nIf an opponent controls a Plains and you control a Mountain, you may cast Kyren Legate without paying its mana cost. +Oracle:Haste\nIf an opponent controls a Plains and you control a Mountain, you may cast this spell without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/m/massacre.txt b/forge-gui/res/cardsfolder/m/massacre.txt index 2cc529de824..a46e441dee3 100644 --- a/forge-gui/res/cardsfolder/m/massacre.txt +++ b/forge-gui/res/cardsfolder/m/massacre.txt @@ -1,9 +1,9 @@ Name:Massacre ManaCost:2 B B Types:Sorcery -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls a Plains and you control a Swamp, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls a Plains and you control a Swamp, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Plains.OppCtrl SVar:Y:Count$Valid Swamp.YouCtrl A:SP$ PumpAll | Cost$ 2 B B | ValidCards$ Creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ All creatures get -2/-2 until end of turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/massacre.jpg -Oracle:If an opponent controls a Plains and you control a Swamp, you may cast Massacre without paying its mana cost.\nAll creatures get -2/-2 until end of turn. +Oracle:If an opponent controls a Plains and you control a Swamp, you may cast this spell without paying its mana cost.\nAll creatures get -2/-2 until end of turn. diff --git a/forge-gui/res/cardsfolder/m/mogg_salvage.txt b/forge-gui/res/cardsfolder/m/mogg_salvage.txt index 7bdc66e80ab..debde464dd4 100644 --- a/forge-gui/res/cardsfolder/m/mogg_salvage.txt +++ b/forge-gui/res/cardsfolder/m/mogg_salvage.txt @@ -1,9 +1,9 @@ Name:Mogg Salvage ManaCost:2 R Types:Instant -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls an Island and you control a Mountain, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls an Island and you control a Mountain, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Island.OppCtrl SVar:Y:Count$Valid Mountain.YouCtrl A:SP$ Destroy | Cost$ 2 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_salvage.jpg -Oracle:If an opponent controls an Island and you control a Mountain, you may cast Mogg Salvage without paying its mana cost.\nDestroy target artifact. +Oracle:If an opponent controls an Island and you control a Mountain, you may cast this spell without paying its mana cost.\nDestroy target artifact. diff --git a/forge-gui/res/cardsfolder/p/patricians_scorn.txt b/forge-gui/res/cardsfolder/p/patricians_scorn.txt index 87a39c75ab7..5931b29ad6e 100644 --- a/forge-gui/res/cardsfolder/p/patricians_scorn.txt +++ b/forge-gui/res/cardsfolder/p/patricians_scorn.txt @@ -2,7 +2,7 @@ Name:Patrician's Scorn ManaCost:3 W Types:Instant A:SP$ DestroyAll | Cost$ 3 W | ValidCards$ Enchantment | SpellDescription$ Destroy all enchantments. -A:SP$ DestroyAll | Cost$ 0 | ValidCards$ Enchantment | CheckSVar$ X | SVarCompare$ GE1 | References$ X | SpellDescription$ If you've cast another white spell this turn, you may cast CARDNAME without paying its mana cost. Destroy all enchantments. +A:SP$ DestroyAll | Cost$ 0 | ValidCards$ Enchantment | CheckSVar$ X | SVarCompare$ GE1 | References$ X | SpellDescription$ If you've cast another white spell this turn, you may cast this spell without paying its mana cost. Destroy all enchantments. SVar:X:Count$ThisTurnCast_Card.White+Other+YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/patricians_scorn.jpg -Oracle:If you've cast another white spell this turn, you may cast Patrician's Scorn without paying its mana cost.\nDestroy all enchantments. +Oracle:If you've cast another white spell this turn, you may cast this spell without paying its mana cost.\nDestroy all enchantments. diff --git a/forge-gui/res/cardsfolder/r/refreshing_rain.txt b/forge-gui/res/cardsfolder/r/refreshing_rain.txt index 4855603a83d..2ce7f1d83cb 100644 --- a/forge-gui/res/cardsfolder/r/refreshing_rain.txt +++ b/forge-gui/res/cardsfolder/r/refreshing_rain.txt @@ -1,9 +1,9 @@ Name:Refreshing Rain ManaCost:3 G Types:Instant -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls a Swamp and you control a Forest, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls a Swamp and you control a Forest, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Swamp.OppCtrl SVar:Y:Count$Valid Forest.YouCtrl A:SP$ GainLife | Cost$ 3 G | LifeAmount$ 6 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player gains 6 life. SVar:Picture:http://www.wizards.com/global/images/magic/general/refreshing_rain.jpg -Oracle:If an opponent controls a Swamp and you control a Forest, you may cast Refreshing Rain without paying its mana cost.\nTarget player gains 6 life. +Oracle:If an opponent controls a Swamp and you control a Forest, you may cast this spell without paying its mana cost.\nTarget player gains 6 life. diff --git a/forge-gui/res/cardsfolder/r/rushwood_legate.txt b/forge-gui/res/cardsfolder/r/rushwood_legate.txt index 1abba122043..2ab40f2c1f6 100644 --- a/forge-gui/res/cardsfolder/r/rushwood_legate.txt +++ b/forge-gui/res/cardsfolder/r/rushwood_legate.txt @@ -2,8 +2,8 @@ Name:Rushwood Legate ManaCost:2 G Types:Creature Dryad PT:2/1 -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls an Island and you control a Forest, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls an Island and you control a Forest, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Island.OppCtrl SVar:Y:Count$Valid Forest.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/rushwood_legate.jpg -Oracle:If an opponent controls an Island and you control a Forest, you may cast Rushwood Legate without paying its mana cost. +Oracle:If an opponent controls an Island and you control a Forest, you may cast this spell without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/s/saprazzan_legate.txt b/forge-gui/res/cardsfolder/s/saprazzan_legate.txt index 8bfd797fd89..45609bc0703 100644 --- a/forge-gui/res/cardsfolder/s/saprazzan_legate.txt +++ b/forge-gui/res/cardsfolder/s/saprazzan_legate.txt @@ -3,8 +3,8 @@ ManaCost:3 U Types:Creature Merfolk Soldier PT:1/3 K:Flying -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Mountain and you control an Island, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Mountain and you control an Island, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Mountain.OppCtrl SVar:Y:Count$Valid Island.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/saprazzan_legate.jpg -Oracle:Flying\nIf an opponent controls a Mountain and you control an Island, you may cast Saprazzan Legate without paying its mana cost. +Oracle:Flying\nIf an opponent controls a Mountain and you control an Island, you may cast this spell without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/s/sivvis_ruse.txt b/forge-gui/res/cardsfolder/s/sivvis_ruse.txt index 2082be2dc08..d68a6cba248 100644 --- a/forge-gui/res/cardsfolder/s/sivvis_ruse.txt +++ b/forge-gui/res/cardsfolder/s/sivvis_ruse.txt @@ -1,11 +1,11 @@ Name:Sivvi's Ruse ManaCost:2 W W Types:Instant -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Mountain and you control a Plains, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Mountain and you control a Plains, you may cast this spell without paying its mana cost. A:SP$ Effect | Cost$ 2 W W | Name$ Sivvi's Ruse Effect | ReplacementEffects$ RPrevent | SpellDescription$ Prevent all damage that would be dealt this turn to creatures you control. SVar:RPrevent:Event$ DamageDone | Prevent$ True | ActiveZones$ Command | ValidTarget$ Creature.YouCtrl | Description$ Prevent all damage that would be dealt this turn to creatures you control. SVar:X:Count$Valid Mountain.OppCtrl SVar:Y:Count$Valid Plains.YouCtrl SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/sivvis_ruse.jpg -Oracle:If an opponent controls a Mountain and you control a Plains, you may cast Sivvi's Ruse without paying its mana cost.\nPrevent all damage that would be dealt this turn to creatures you control. +Oracle:If an opponent controls a Mountain and you control a Plains, you may cast this spell without paying its mana cost.\nPrevent all damage that would be dealt this turn to creatures you control. diff --git a/forge-gui/res/cardsfolder/s/submerge.txt b/forge-gui/res/cardsfolder/s/submerge.txt index 45e7dd9225c..31bfd5eede7 100644 --- a/forge-gui/res/cardsfolder/s/submerge.txt +++ b/forge-gui/res/cardsfolder/s/submerge.txt @@ -1,9 +1,9 @@ Name:Submerge ManaCost:4 U Types:Instant -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Forest and you control an Island, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Forest and you control an Island, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Forest.OppCtrl SVar:Y:Count$Valid Island.YouCtrl A:SP$ ChangeZone | Cost$ 4 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature on top of its owner's library. SVar:Picture:http://www.wizards.com/global/images/magic/general/submerge.jpg -Oracle:If an opponent controls a Forest and you control an Island, you may cast Submerge without paying its mana cost.\nPut target creature on top of its owner's library. +Oracle:If an opponent controls a Forest and you control an Island, you may cast this spell without paying its mana cost.\nPut target creature on top of its owner's library. From bdcb9693be1ff62adccb66d1ba9f37504b0342b7 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Sun, 23 Sep 2018 16:08:16 +0000 Subject: [PATCH 03/39] Tempting Offers (M19) --- forge-gui/res/cardsfolder/t/tempt_with_immortality.txt | 4 ++-- forge-gui/res/cardsfolder/t/tempt_with_vengeance.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/t/tempt_with_immortality.txt b/forge-gui/res/cardsfolder/t/tempt_with_immortality.txt index 17b880269e4..b1f0511d18c 100644 --- a/forge-gui/res/cardsfolder/t/tempt_with_immortality.txt +++ b/forge-gui/res/cardsfolder/t/tempt_with_immortality.txt @@ -1,7 +1,7 @@ Name:Tempt with Immortality ManaCost:4 B Types:Sorcery -A:SP$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | ChangeNum$ 1 | Hidden$ True | SubAbility$ DBRepeat | StackDescription$ SpellDescription | SpellDescription$ Tempting offer — Return a creature card from your graveyard to the battlefield. Each opponent may return a creature card from their graveyard to the battlefield. For each player who does, return a creature card from your graveyard to the battlefield. +A:SP$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | ChangeNum$ 1 | Hidden$ True | SubAbility$ DBRepeat | StackDescription$ SpellDescription | SpellDescription$ Tempting offer — Return a creature card from your graveyard to the battlefield. Each opponent may return a creature card from their graveyard to the battlefield. For each opponent who does, return a creature card from your graveyard to the battlefield. SVar:DBRepeat:DB$ RepeatEach | RepeatSubAbility$ DBChangeZone | RepeatPlayers$ Player.Opponent | SubAbility$ DBReturn SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.RememberedPlayerCtrl | DefinedPlayer$ Player.IsRemembered | Chooser$ Player.IsRemembered | ChangeNum$ 1 | Hidden$ True | RememberChanged$ True SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | ChangeNum$ X | References$ X | Hidden$ True | SubAbility$ DBCleanup @@ -10,4 +10,4 @@ SVar:X:Remembered$Amount SVar:NeedsToPlayVar:Y GE2 SVar:Y:Count$TypeInYourYard.Creature SVar:Picture:http://www.wizards.com/global/images/magic/general/tempt_with_immortality.jpg -Oracle:Tempting offer — Return a creature card from your graveyard to the battlefield. Each opponent may return a creature card from their graveyard to the battlefield. For each player who does, return a creature card from your graveyard to the battlefield. +Oracle:Tempting offer — Return a creature card from your graveyard to the battlefield. Each opponent may return a creature card from their graveyard to the battlefield. For each opponent who does, return a creature card from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/t/tempt_with_vengeance.txt b/forge-gui/res/cardsfolder/t/tempt_with_vengeance.txt index 2525681f0e6..54a0d6ffeb2 100644 --- a/forge-gui/res/cardsfolder/t/tempt_with_vengeance.txt +++ b/forge-gui/res/cardsfolder/t/tempt_with_vengeance.txt @@ -1,7 +1,7 @@ Name:Tempt with Vengeance ManaCost:X R Types:Sorcery -A:SP$ Token | Cost$ X R | TokenAmount$ X | References$ X | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Haste | SubAbility$ DBRepeat | StackDescription$ SpellDescription | SpellDescription$ Tempting offer — Create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each player who does, create X 1/1 red Elemental creature tokens with haste. +A:SP$ Token | Cost$ X R | TokenAmount$ X | References$ X | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Haste | SubAbility$ DBRepeat | StackDescription$ SpellDescription | SpellDescription$ Tempting offer — Create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each opponent who does, create X 1/1 red Elemental creature tokens with haste. SVar:DBRepeat:DB$ RepeatEach | RepeatSubAbility$ DBTokenOpp | RepeatPlayers$ Player.Opponent | RepeatOptionalForEachPlayer$ True | RepeatOptionalMessage$ Do you want to create X 1/1 red Elemental creature tokens with haste? | SubAbility$ DBToken SVar:DBTokenOpp:DB$ Token | TokenAmount$ X | References$ X | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ Player.IsRemembered | TokenColors$ Red | TokenPower$ 1 | TokenKeywords$ Haste | TokenToughness$ 1 | SubAbility$ DBCount SVar:DBCount:DB$ StoreSVar | SVar$ Y | Type$ CountSVar | Expression$ Y/Plus.1 | References$ Y @@ -11,4 +11,4 @@ SVar:Y:Number$0 SVar:X:Count$xPaid SVar:Z:SVar$X/Times.Y SVar:Picture:http://www.wizards.com/global/images/magic/general/tempt_with_vengeance.jpg -Oracle:Tempting offer — Create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each player who does, create X 1/1 red Elemental creature tokens with haste. +Oracle:Tempting offer — Create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each opponent who does, create X 1/1 red Elemental creature tokens with haste. From 458ccd5ce024e07bd969e197457f5f878c6288e9 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Sun, 23 Sep 2018 16:10:57 +0000 Subject: [PATCH 04/39] Stealing Dreams --- forge-gui/res/cardsfolder/d/dream_pillager.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/d/dream_pillager.txt b/forge-gui/res/cardsfolder/d/dream_pillager.txt index 9956b223480..53c861debfc 100644 --- a/forge-gui/res/cardsfolder/d/dream_pillager.txt +++ b/forge-gui/res/cardsfolder/d/dream_pillager.txt @@ -3,11 +3,11 @@ ManaCost:5 R R Types:Creature Dragon PT:4/4 K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, exile that many cards from the top of your library. Until end of turn, you may cast nonland cards exiled this way. +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, exile that many cards from the top of your library. Until end of turn, you may cast nonland cards from among those exiled cards. SVar:TrigExile:DB$ Mill | Defined$ You | NumCards$ X | References$ X | Destination$ Exile | RememberMilled$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | ForgetOnMoved$ Exile | RememberObjects$ RememberedCard | SubAbility$ DBCleanup -SVar:STPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Card.nonLand+IsRemembered | MayPlay$ True | AffectedZone$ Exile | Description$ Until end of turn, you may play that card. +SVar:STPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Card.nonLand+IsRemembered | MayPlay$ True | AffectedZone$ Exile | Description$ Until end of turn, you may cast nonland cards from among those exiled cards. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:TriggerCount$DamageAmount SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_pillager.jpg -Oracle:Flying\nWhenever Dream Pillager deals combat damage to a player, exile that many cards from the top of your library. Until end of turn, you may cast nonland cards exiled this way. +Oracle:Flying\nWhenever Dream Pillager deals combat damage to a player, exile that many cards from the top of your library. Until end of turn, you may cast nonland cards from among those exiled cards. From 59214fe332b0a888f28fa6c0750f14d120707470 Mon Sep 17 00:00:00 2001 From: schnautzr Date: Sat, 23 Feb 2019 20:59:19 -0600 Subject: [PATCH 05/39] Code cleanup - deprecations --- .../src/main/java/forge/ai/AiController.java | 2 +- .../main/java/forge/ai/ComputerUtilCard.java | 8 +++--- .../main/java/forge/ai/ComputerUtilCost.java | 2 +- .../java/forge/ai/PlayerControllerAi.java | 2 +- .../forge/ai/ability/ActivateAbilityAi.java | 6 ++--- .../main/java/forge/ai/ability/AnimateAi.java | 4 +-- .../main/java/forge/ai/ability/BalanceAi.java | 2 +- .../main/java/forge/ai/ability/BidLifeAi.java | 2 +- .../java/forge/ai/ability/ChangeZoneAi.java | 10 +++---- .../java/forge/ai/ability/ChooseCardAi.java | 2 +- .../forge/ai/ability/ChooseCardNameAi.java | 2 +- .../java/forge/ai/ability/ChooseColorAi.java | 4 +-- .../java/forge/ai/ability/ChooseNumberAi.java | 2 +- .../java/forge/ai/ability/ChooseSourceAi.java | 2 +- .../forge/ai/ability/ControlExchangeAi.java | 2 +- .../forge/ai/ability/CountersPutAllAi.java | 6 ++--- .../java/forge/ai/ability/DamageAiBase.java | 4 +-- .../java/forge/ai/ability/DamageAllAi.java | 4 +-- .../java/forge/ai/ability/DamageDealAi.java | 4 +-- .../main/java/forge/ai/ability/DebuffAi.java | 4 +-- .../main/java/forge/ai/ability/DestroyAi.java | 2 +- .../java/forge/ai/ability/DestroyAllAi.java | 2 +- .../src/main/java/forge/ai/ability/DigAi.java | 4 +-- .../java/forge/ai/ability/DigUntilAi.java | 2 +- .../main/java/forge/ai/ability/DiscardAi.java | 10 +++---- .../java/forge/ai/ability/DrainManaAi.java | 6 ++--- .../src/main/java/forge/ai/ability/FogAi.java | 2 +- .../java/forge/ai/ability/GameLossAi.java | 7 ++--- .../java/forge/ai/ability/LifeExchangeAi.java | 4 +-- .../ai/ability/LifeExchangeVariantAi.java | 2 +- .../main/java/forge/ai/ability/LifeSetAi.java | 4 +-- .../java/forge/ai/ability/MustBlockAi.java | 2 +- .../forge/ai/ability/PowerExchangeAi.java | 2 +- .../main/java/forge/ai/ability/ProtectAi.java | 2 +- .../java/forge/ai/ability/PumpAiBase.java | 2 +- .../main/java/forge/ai/ability/PumpAllAi.java | 2 +- .../ai/ability/RearrangeTopOfLibraryAi.java | 2 +- .../main/java/forge/ai/ability/RepeatAi.java | 4 +-- .../java/forge/ai/ability/SacrificeAi.java | 2 +- .../java/forge/ai/ability/SacrificeAllAi.java | 2 +- .../main/java/forge/ai/ability/TapAiBase.java | 2 +- .../main/java/forge/ai/ability/TapAllAi.java | 7 ++--- .../main/java/forge/ai/ability/TokenAi.java | 8 +++--- .../java/forge/ai/ability/TwoPilesAi.java | 2 +- .../java/forge/ai/ability/UnattachAllAi.java | 2 +- .../main/java/forge/ai/ability/UntapAi.java | 2 +- .../forge/ai/simulation/GameSimulator.java | 2 +- .../src/main/java/forge/util/ImageUtil.java | 4 +-- .../src/main/java/forge/control/FControl.java | 2 +- .../java/forge/gui/ImportSourceAnalyzer.java | 26 +++---------------- .../itemmanager/filters/TextSearchFilter.java | 2 +- .../forge/itemmanager/views/ItemView.java | 4 +-- .../deckeditor/controllers/ACEditorBase.java | 4 +-- .../screens/workshop/views/VCardScript.java | 2 +- .../main/java/forge/toolbox/FUndoManager.java | 8 +++--- .../java/forge/itemmanager/ColumnDef.java | 3 ++- .../forge/player/PlayerControllerHuman.java | 18 ++++++------- .../forge/quest/QuestChallengeGenerator.java | 12 ++++----- .../forge/quest/QuestEventLDADuelManager.java | 6 ++--- .../java/forge/quest/QuestUtilUnlockSets.java | 2 +- .../java/forge/quest/data/QuestAssets.java | 10 +++++-- .../forge/util/AbstractGeneticAlgorithm.java | 6 ++--- .../src/main/java/forge/util/XmlReader.java | 2 +- 63 files changed, 131 insertions(+), 144 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index c4fc6be078f..fc09f786d64 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1771,7 +1771,7 @@ public class AiController { + MyRandom.getRandom().nextInt(3); return Math.max(remaining, min) / 2; } else if ("LowestLoseLife".equals(logic)) { - return MyRandom.getRandom().nextInt(Math.min(player.getLife() / 3, ComputerUtil.getOpponentFor(player).getLife())) + 1; + return MyRandom.getRandom().nextInt(Math.min(player.getLife() / 3, player.getWeakestOpponent().getLife())) + 1; } else if ("HighestGetCounter".equals(logic)) { return MyRandom.getRandom().nextInt(3); } else if (source.hasSVar("EnergyToPay")) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index af09e275ed6..ad0360a6e66 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -521,7 +521,7 @@ public class ComputerUtilCard { */ public static CardCollectionView getLikelyBlockers(final Player ai, final CardCollectionView blockers) { AiBlockController aiBlk = new AiBlockController(ai); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); Combat combat = new Combat(opp); //Use actual attackers if available, else consider all possible attackers Combat currentCombat = ai.getGame().getCombat(); @@ -884,7 +884,7 @@ public class ComputerUtilCard { List chosen = new ArrayList(); Player ai = sa.getActivatingPlayer(); final Game game = ai.getGame(); - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); if (sa.hasParam("AILogic")) { final String logic = sa.getParam("AILogic"); @@ -974,7 +974,7 @@ public class ComputerUtilCard { public static boolean useRemovalNow(final SpellAbility sa, final Card c, final int dmg, ZoneType destination) { final Player ai = sa.getActivatingPlayer(); final AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); final Game game = ai.getGame(); final PhaseHandler ph = game.getPhaseHandler(); final PhaseType phaseType = ph.getPhase(); @@ -1269,7 +1269,7 @@ public class ComputerUtilCard { } } - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); Card pumped = getPumpedCreature(ai, sa, c, toughness, power, keywords); List oppCreatures = opp.getCreaturesInPlay(); float chance = 0; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index fb44ff4e31c..be844f04815 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -626,7 +626,7 @@ public class ComputerUtilCost { && (!source.getName().equals("Tyrannize") || payer.getCardsIn(ZoneType.Hand).size() > 2) && (!source.getName().equals("Perplex") || payer.getCardsIn(ZoneType.Hand).size() < 2) && (!source.getName().equals("Breaking Point") || payer.getCreaturesInPlay().size() > 1) - && (!source.getName().equals("Chain of Vapor") || (ComputerUtil.getOpponentFor(payer).getCreaturesInPlay().size() > 0 && payer.getLandsInPlay().size() > 3)); + && (!source.getName().equals("Chain of Vapor") || (payer.getWeakestOpponent().getCreaturesInPlay().size() > 0 && payer.getLandsInPlay().size() > 3)); } public static Set getAvailableManaColors(Player ai, Card additionalLand) { diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 3ce2d7333da..fe28d597505 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -1060,7 +1060,7 @@ public class PlayerControllerAi extends PlayerController { public String chooseCardName(SpellAbility sa, Predicate cpp, String valid, String message) { if (sa.hasParam("AILogic")) { CardCollectionView aiLibrary = player.getCardsIn(ZoneType.Library); - CardCollectionView oppLibrary = ComputerUtil.getOpponentFor(player).getCardsIn(ZoneType.Library); + CardCollectionView oppLibrary = player.getWeakestOpponent().getCardsIn(ZoneType.Library); final Card source = sa.getHostCard(); final String logic = sa.getParam("AILogic"); diff --git a/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java index 7eba97960da..ac7176b2aea 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java @@ -22,7 +22,7 @@ public class ActivateAbilityAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); final Card source = sa.getHostCard(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); boolean randomReturn = MyRandom.getRandom().nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); List list = CardLists.getType(opp.getCardsIn(ZoneType.Battlefield), sa.getParamOrDefault("Type", "Card")); @@ -46,7 +46,7 @@ public class ActivateAbilityAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); final TargetRestrictions tgt = sa.getTargetRestrictions(); final Card source = sa.getHostCard(); @@ -87,7 +87,7 @@ public class ActivateAbilityAi extends SpellAbilityAi { } } else { sa.resetTargets(); - sa.getTargets().add(ComputerUtil.getOpponentFor(ai)); + sa.getTargets().add(ai.getWeakestOpponent()); } return randomReturn; diff --git a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java index 0537a2cf21f..fc1b71a3189 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -77,13 +77,13 @@ public class AnimateAi extends SpellAbilityAi { num = (num == null) ? "1" : num; final int nToSac = AbilityUtils.calculateAmount(topStack.getHostCard(), num, topStack); CardCollection list = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), - ComputerUtil.getOpponentFor(ai), topStack.getHostCard(), topStack); + ai.getWeakestOpponent(), topStack.getHostCard(), topStack); list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack)); ComputerUtilCard.sortByEvaluateCreature(list); if (!list.isEmpty() && list.size() == nToSac && ComputerUtilCost.canPayCost(sa, ai)) { Card animatedCopy = becomeAnimated(source, sa); list.add(animatedCopy); - list = CardLists.getValidCards(list, valid.split(","), ComputerUtil.getOpponentFor(ai), topStack.getHostCard(), + list = CardLists.getValidCards(list, valid.split(","), ai.getWeakestOpponent(), topStack.getHostCard(), topStack); list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack)); if (ComputerUtilCard.evaluateCreature(animatedCopy) < ComputerUtilCard.evaluateCreature(list.get(0)) diff --git a/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java b/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java index b5576134334..25ff20577bb 100644 --- a/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java @@ -17,7 +17,7 @@ public class BalanceAi extends SpellAbilityAi { int diff = 0; // TODO Add support for multiplayer logic - final Player opp = ComputerUtil.getOpponentFor(aiPlayer); + final Player opp = aiPlayer.getWeakestOpponent(); final CardCollectionView humPerms = opp.getCardsIn(ZoneType.Battlefield); final CardCollectionView compPerms = aiPlayer.getCardsIn(ZoneType.Battlefield); diff --git a/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java b/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java index 55ceb865919..47232afb6b2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java @@ -25,7 +25,7 @@ public class BidLifeAi extends SpellAbilityAi { if (tgt != null) { sa.resetTargets(); if (tgt.canTgtCreature()) { - List list = CardLists.getTargetableCards(ComputerUtil.getOpponentFor(aiPlayer).getCardsIn(ZoneType.Battlefield), sa); + List list = CardLists.getTargetableCards(aiPlayer.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), sa); list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source, sa); if (list.isEmpty()) { return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index e5c52128bef..5ce782ed1a2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -202,7 +202,7 @@ public class ChangeZoneAi extends SpellAbilityAi { final Card source = sa.getHostCard(); final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa); ZoneType origin = null; - final Player opponent = ComputerUtil.getOpponentFor(ai); + final Player opponent = ai.getWeakestOpponent(); boolean activateForCost = ComputerUtil.activateForCost(sa, ai); if (sa.hasParam("Origin")) { @@ -407,7 +407,7 @@ public class ChangeZoneAi extends SpellAbilityAi { // if putting cards from hand to library and parent is drawing cards // make sure this will actually do something: final TargetRestrictions tgt = sa.getTargetRestrictions(); - final Player opp = ComputerUtil.getOpponentFor(aiPlayer); + final Player opp = aiPlayer.getWeakestOpponent(); if (tgt != null && tgt.canTgtPlayer()) { boolean isCurse = sa.isCurse(); if (isCurse && sa.canTarget(opp)) { @@ -468,7 +468,7 @@ public class ChangeZoneAi extends SpellAbilityAi { Iterable pDefined; final TargetRestrictions tgt = sa.getTargetRestrictions(); if ((tgt != null) && tgt.canTgtPlayer()) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); if (sa.isCurse()) { if (sa.canTarget(opp)) { sa.getTargets().add(opp); @@ -587,7 +587,7 @@ public class ChangeZoneAi extends SpellAbilityAi { */ private static Card chooseCreature(final Player ai, CardCollection list) { // Creating a new combat for testing purposes. - final Player opponent = ComputerUtil.getOpponentFor(ai); + final Player opponent = ai.getWeakestOpponent(); Combat combat = new Combat(opponent); for (Card att : opponent.getCreaturesInPlay()) { combat.addAttacker(att, ai); @@ -902,7 +902,7 @@ public class ChangeZoneAi extends SpellAbilityAi { && !currCombat.getBlockers(attacker).isEmpty()) { ComputerUtilCard.sortByEvaluateCreature(blockers); Combat combat = new Combat(ai); - combat.addAttacker(attacker, ComputerUtil.getOpponentFor(ai)); + combat.addAttacker(attacker, ai.getWeakestOpponent()); for (Card blocker : blockers) { combat.addBlocker(attacker, blocker); } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java index db861634ebe..cc28d0705b6 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java @@ -127,7 +127,7 @@ public class ChooseCardAi extends SpellAbilityAi { } } else if (aiLogic.equals("Duneblast")) { CardCollection aiCreatures = ai.getCreaturesInPlay(); - CardCollection oppCreatures = ComputerUtil.getOpponentFor(ai).getCreaturesInPlay(); + CardCollection oppCreatures = ai.getWeakestOpponent().getCreaturesInPlay(); aiCreatures = CardLists.getNotKeyword(aiCreatures, Keyword.INDESTRUCTIBLE); oppCreatures = CardLists.getNotKeyword(oppCreatures, Keyword.INDESTRUCTIBLE); diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java index 6148e60fdb5..ff0bfc2ceaa 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java @@ -41,7 +41,7 @@ public class ChooseCardNameAi extends SpellAbilityAi { if (tgt != null) { sa.resetTargets(); if (tgt.canOnlyTgtOpponent()) { - sa.getTargets().add(ComputerUtil.getOpponentFor(ai)); + sa.getTargets().add(ai.getWeakestOpponent()); } else { sa.getTargets().add(ai); } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java index 905fdab48f8..8ba40274dcd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java @@ -52,7 +52,7 @@ public class ChooseColorAi extends SpellAbilityAi { } if ("Addle".equals(sourceName)) { - if (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) || ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Hand).isEmpty()) { + if (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) || ai.getWeakestOpponent().getCardsIn(ZoneType.Hand).isEmpty()) { return false; } return true; @@ -61,7 +61,7 @@ public class ChooseColorAi extends SpellAbilityAi { if (logic.equals("MostExcessOpponentControls")) { for (byte color : MagicColor.WUBRG) { CardCollectionView ailist = ai.getCardsIn(ZoneType.Battlefield); - CardCollectionView opplist = ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield); + CardCollectionView opplist = ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield); ailist = CardLists.filter(ailist, CardPredicates.isColor(color)); opplist = CardLists.filter(opplist, CardPredicates.isColor(color)); diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java index fe84327251b..41e7024af58 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java @@ -17,7 +17,7 @@ public class ChooseNumberAi extends SpellAbilityAi { TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { sa.resetTargets(); - Player opp = ComputerUtil.getOpponentFor(aiPlayer); + Player opp = aiPlayer.getWeakestOpponent(); if (sa.canTarget(opp)) { sa.getTargets().add(opp); } else { diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java index 7f740adb8dc..1357193ec82 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java @@ -68,7 +68,7 @@ public class ChooseSourceAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { sa.resetTargets(); - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); if (sa.canTarget(opp)) { sa.getTargets().add(opp); } else { diff --git a/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java index ab3c3465127..3aadb95d5c1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java @@ -30,7 +30,7 @@ public class ControlExchangeAi extends SpellAbilityAi { sa.resetTargets(); CardCollection list = - CardLists.getValidCards(ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa); + CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa); // AI won't try to grab cards that are filtered out of AI decks on // purpose list = CardLists.filter(list, new Predicate() { diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java index 82dc7f1adfd..da77baf1e71 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java @@ -39,7 +39,7 @@ public class CountersPutAllAi extends SpellAbilityAi { final boolean curse = sa.isCurse(); final TargetRestrictions tgt = sa.getTargetRestrictions(); - hList = CardLists.getValidCards(ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); + hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); if (abCost != null) { @@ -68,7 +68,7 @@ public class CountersPutAllAi extends SpellAbilityAi { } if (tgt != null) { - Player pl = curse ? ComputerUtil.getOpponentFor(ai) : ai; + Player pl = curse ? ai.getWeakestOpponent() : ai; sa.getTargets().add(pl); hList = CardLists.filterControlledBy(hList, pl); @@ -149,7 +149,7 @@ public class CountersPutAllAi extends SpellAbilityAi { */ @Override public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { - return player.getCreaturesInPlay().size() >= ComputerUtil.getOpponentFor(player).getCreaturesInPlay().size(); + return player.getCreaturesInPlay().size() >= player.getWeakestOpponent().getCreaturesInPlay().size(); } @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java index 1b2dc7ee7fd..6d3e72ad892 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java @@ -20,7 +20,7 @@ import forge.util.MyRandom; public abstract class DamageAiBase extends SpellAbilityAi { protected boolean avoidTargetP(final Player comp, final SpellAbility sa) { - Player enemy = ComputerUtil.getOpponentFor(comp); + Player enemy = comp.getWeakestOpponent(); // Logic for cards that damage owner, like Fireslinger // Do not target a player if they aren't below 75% of our health. // Unless Lifelink will cancel the damage to us @@ -54,7 +54,7 @@ public abstract class DamageAiBase extends SpellAbilityAi { protected boolean shouldTgtP(final Player comp, final SpellAbility sa, final int d, final boolean noPrevention, final boolean noPlaneswalkerRedirection) { int restDamage = d; final Game game = comp.getGame(); - Player enemy = ComputerUtil.getOpponentFor(comp); + Player enemy = comp.getWeakestOpponent(); boolean dmgByCardsInHand = false; if ("X".equals(sa.getParam("NumDmg")) && sa.getHostCard() != null && sa.hasSVar(sa.getParam("NumDmg")) && diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java index e43dfac49ab..cbede1c1a11 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java @@ -212,7 +212,7 @@ public class DamageAllAi extends SpellAbilityAi { } // Evaluate creatures getting killed - Player enemy = ComputerUtil.getOpponentFor(ai); + Player enemy = ai.getWeakestOpponent(); final CardCollection humanList = getKillableCreatures(sa, enemy, dmg); CardCollection computerList = getKillableCreatures(sa, ai, dmg); final TargetRestrictions tgt = sa.getTargetRestrictions(); @@ -294,7 +294,7 @@ public class DamageAllAi extends SpellAbilityAi { } // Evaluate creatures getting killed - Player enemy = ComputerUtil.getOpponentFor(ai); + Player enemy = ai.getWeakestOpponent(); final CardCollection humanList = getKillableCreatures(sa, enemy, dmg); CardCollection computerList = getKillableCreatures(sa, ai, dmg); final TargetRestrictions tgt = sa.getTargetRestrictions(); diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index 580df1f592f..6a2b62dc36d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -547,7 +547,7 @@ public class DamageDealAi extends DamageAiBase { final boolean oppTargetsChoice = sa.hasParam("TargetingPlayer"); final String logic = sa.getParamOrDefault("AILogic", ""); - Player enemy = ComputerUtil.getOpponentFor(ai); + Player enemy = ai.getWeakestOpponent(); if ("PowerDmg".equals(logic)) { // check if it is better to target the player instead, the original target is already set in PumpAi.pumpTgtAI() @@ -873,7 +873,7 @@ public class DamageDealAi extends DamageAiBase { // this is for Triggered targets that are mandatory final boolean noPrevention = sa.hasParam("NoPrevention"); final boolean divided = sa.hasParam("DividedAsYouChoose"); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); while (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getHostCard(), sa)) { if (tgt.canTgtPlaneswalker()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java index eee46d29579..fa4b85d6588 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java @@ -177,7 +177,7 @@ public class DebuffAi extends SpellAbilityAi { * @return a CardCollection. */ private CardCollection getCurseCreatures(final Player ai, final SpellAbility sa, final List kws) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); CardCollection list = CardLists.getTargetableCards(opp.getCreaturesInPlay(), sa); if (!list.isEmpty()) { list = CardLists.filter(list, new Predicate() { @@ -217,7 +217,7 @@ public class DebuffAi extends SpellAbilityAi { list.remove(c); } - final CardCollection pref = CardLists.filterControlledBy(list, ComputerUtil.getOpponentFor(ai)); + final CardCollection pref = CardLists.filterControlledBy(list, ai.getWeakestOpponent()); final CardCollection forced = CardLists.filterControlledBy(list, ai); final Card source = sa.getHostCard(); diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java index 06705baf8bf..cede308bfc7 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -288,7 +288,7 @@ public class DestroyAi extends SpellAbilityAi { } else if (sa.hasParam("Defined")) { list = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa); if ("WillSkipTurn".equals(logic) && (sa.getHostCard().getController().equals(ai) - || ai.getCreaturesInPlay().size() < ComputerUtil.getOpponentFor(ai).getCreaturesInPlay().size() + || ai.getCreaturesInPlay().size() < ai.getWeakestOpponent().getCreaturesInPlay().size() || !source.getGame().getPhaseHandler().isPlayerTurn(ai) || ai.getLife() <= 5)) { // Basic ai logic for Lethal Vapors diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java index b2b06161f29..16d426c7f62 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java @@ -66,7 +66,7 @@ public class DestroyAllAi extends SpellAbilityAi { public boolean doMassRemovalLogic(Player ai, SpellAbility sa) { final Card source = sa.getHostCard(); final String logic = sa.getParamOrDefault("AILogic", ""); - Player opponent = ComputerUtil.getOpponentFor(ai); // TODO: how should this AI logic work for multiplayer and getOpponents()? + Player opponent = ai.getWeakestOpponent(); // TODO: how should this AI logic work for multiplayer and getOpponents()? final int CREATURE_EVAL_THRESHOLD = 200; diff --git a/forge-ai/src/main/java/forge/ai/ability/DigAi.java b/forge-ai/src/main/java/forge/ai/ability/DigAi.java index 7a56eb279a8..dd58e738a1e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DigAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DigAi.java @@ -20,7 +20,7 @@ public class DigAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player ai, SpellAbility sa) { final Game game = ai.getGame(); - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); final Card host = sa.getHostCard(); Player libraryOwner = ai; @@ -99,7 +99,7 @@ public class DigAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); if (sa.usesTargeting()) { sa.resetTargets(); if (mandatory && sa.canTarget(opp)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java index 7be26f04209..7464466ca17 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java @@ -36,7 +36,7 @@ public class DigUntilAi extends SpellAbilityAi { final boolean randomReturn = MyRandom.getRandom().nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1); Player libraryOwner = ai; - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); if ("DontMillSelf".equals(logic)) { // A card that digs for specific things and puts everything revealed before it into graveyard diff --git a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java index 991225e08e1..f17961cdd2c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java @@ -56,7 +56,7 @@ public class DiscardAi extends SpellAbilityAi { return SpecialCardAi.VolrathsShapeshifter.consider(ai, sa); } - final boolean humanHasHand = ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Hand).size() > 0; + final boolean humanHasHand = ai.getWeakestOpponent().getCardsIn(ZoneType.Hand).size() > 0; if (tgt != null) { if (!discardTargetAI(ai, sa)) { @@ -87,7 +87,7 @@ public class DiscardAi extends SpellAbilityAi { if (sa.hasParam("NumCards")) { if (sa.getParam("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. - final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ComputerUtil.getOpponentFor(ai) + final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ai.getWeakestOpponent() .getCardsIn(ZoneType.Hand).size()); if (cardsToDiscard < 1) { return false; @@ -150,7 +150,7 @@ public class DiscardAi extends SpellAbilityAi { private boolean discardTargetAI(final Player ai, final SpellAbility sa) { final TargetRestrictions tgt = sa.getTargetRestrictions(); - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); if (opp.getCardsIn(ZoneType.Hand).isEmpty() && !ComputerUtil.activateForCost(sa, ai)) { return false; } @@ -169,7 +169,7 @@ public class DiscardAi extends SpellAbilityAi { protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); if (!discardTargetAI(ai, sa)) { if (mandatory && sa.canTarget(opp)) { sa.getTargets().add(opp); @@ -190,7 +190,7 @@ public class DiscardAi extends SpellAbilityAi { } if ("X".equals(sa.getParam("RevealNumber")) && sa.getHostCard().getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. - final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ComputerUtil.getOpponentFor(ai) + final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ai.getWeakestOpponent() .getCardsIn(ZoneType.Hand).size()); sa.getHostCard().setSVar("PayX", Integer.toString(cardsToDiscard)); } diff --git a/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java b/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java index a922c0f0508..a383afa8c97 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java @@ -19,7 +19,7 @@ public class DrainManaAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); final Card source = sa.getHostCard(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); boolean randomReturn = MyRandom.getRandom().nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); if (tgt == null) { @@ -41,7 +41,7 @@ public class DrainManaAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); final TargetRestrictions tgt = sa.getTargetRestrictions(); final Card source = sa.getHostCard(); @@ -82,7 +82,7 @@ public class DrainManaAi extends SpellAbilityAi { } } else { sa.resetTargets(); - sa.getTargets().add(ComputerUtil.getOpponentFor(ai)); + sa.getTargets().add(ai.getWeakestOpponent()); } return randomReturn; diff --git a/forge-ai/src/main/java/forge/ai/ability/FogAi.java b/forge-ai/src/main/java/forge/ai/ability/FogAi.java index ecdb0c03b4f..9d919b10b22 100644 --- a/forge-ai/src/main/java/forge/ai/ability/FogAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/FogAi.java @@ -107,7 +107,7 @@ public class FogAi extends SpellAbilityAi { protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) { final Game game = aiPlayer.getGame(); boolean chance; - if (game.getPhaseHandler().isPlayerTurn(ComputerUtil.getOpponentFor(sa.getActivatingPlayer()))) { + if (game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer().getWeakestOpponent())) { chance = game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE); } else { chance = game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DAMAGE); diff --git a/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java b/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java index 1fbb7c7d943..9a06fdc02c1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java @@ -9,7 +9,7 @@ import forge.game.spellability.TargetRestrictions; public class GameLossAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player ai, SpellAbility sa) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); if (opp.cantLose()) { return false; } @@ -34,15 +34,16 @@ public class GameLossAi extends SpellAbilityAi { // Phage the Untouchable // (Final Fortune would need to attach it's delayed trigger to a // specific turn, which can't be done yet) + Player opp = ai.getWeakestOpponent(); - if (!mandatory && ComputerUtil.getOpponentFor(ai).cantLose()) { + if (!mandatory && opp.cantLose()) { return false; } final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { sa.resetTargets(); - sa.getTargets().add(ComputerUtil.getOpponentFor(ai)); + sa.getTargets().add(opp); } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java index e9b7515b950..6514d570595 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java @@ -20,7 +20,7 @@ public class LifeExchangeAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { final int myLife = aiPlayer.getLife(); - Player opponent = ComputerUtil.getOpponentFor(aiPlayer); + Player opponent = aiPlayer.getWeakestOpponent(); final int hLife = opponent.getLife(); if (!aiPlayer.canGainLife()) { @@ -76,7 +76,7 @@ public class LifeExchangeAi extends SpellAbilityAi { final boolean mandatory) { final TargetRestrictions tgt = sa.getTargetRestrictions(); - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); if (tgt != null) { sa.resetTargets(); if (sa.canTarget(opp) && (mandatory || ai.getLife() < opp.getLife())) { diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java index 144e91ff726..e1432844d01 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java @@ -149,7 +149,7 @@ public class LifeExchangeVariantAi extends SpellAbilityAi { final boolean mandatory) { final TargetRestrictions tgt = sa.getTargetRestrictions(); - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); if (tgt != null) { sa.resetTargets(); if (sa.canTarget(opp) && (mandatory || ai.getLife() < opp.getLife())) { diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java index fb8c0797711..4603cc998d9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java @@ -20,7 +20,7 @@ public class LifeSetAi extends SpellAbilityAi { // Ability_Cost abCost = sa.getPayCosts(); final Card source = sa.getHostCard(); final int myLife = ai.getLife(); - final Player opponent = ComputerUtil.getOpponentFor(ai); + final Player opponent = ai.getWeakestOpponent(); final int hlife = opponent.getLife(); final String amountStr = sa.getParam("LifeAmount"); @@ -107,7 +107,7 @@ public class LifeSetAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { final int myLife = ai.getLife(); - final Player opponent = ComputerUtil.getOpponentFor(ai); + final Player opponent = ai.getWeakestOpponent(); final int hlife = opponent.getLife(); final Card source = sa.getHostCard(); final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa); diff --git a/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java b/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java index e01d0b38943..238ba76c409 100644 --- a/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java @@ -95,7 +95,7 @@ public class MustBlockAi extends SpellAbilityAi { boolean chance = false; if (abTgt != null) { - final List list = determineGoodBlockers(definedAttacker, ai, ComputerUtil.getOpponentFor(ai), sa, true,true); + final List list = determineGoodBlockers(definedAttacker, ai, ai.getWeakestOpponent(), sa, true,true); if (list.isEmpty()) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java index 6dd2e5aa767..1d3cceaf8c6 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java @@ -31,7 +31,7 @@ public class PowerExchangeAi extends SpellAbilityAi { sa.resetTargets(); List list = - CardLists.getValidCards(ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa); + CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa); // AI won't try to grab cards that are filtered out of AI decks on // purpose list = CardLists.filter(list, new Predicate() { diff --git a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java index a7030e1180f..513b8689a0c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java @@ -146,7 +146,7 @@ public class ProtectAi extends SpellAbilityAi { if (s==null) { return false; } else { - Player opponent = ComputerUtil.getOpponentFor(ai); + Player opponent = ai.getWeakestOpponent(); Combat combat = ai.getGame().getCombat(); int dmg = ComputerUtilCombat.damageIfUnblocked(c, opponent, combat, true); float ratio = 1.0f * dmg / opponent.getLife(); diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java index 89af0bf5722..e4567af164f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java @@ -177,7 +177,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { final Game game = ai.getGame(); final Combat combat = game.getCombat(); final PhaseHandler ph = game.getPhaseHandler(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); final int newPower = card.getNetCombatDamage() + attack; //int defense = getNumDefense(sa); if (!CardUtil.isStackingKeyword(keyword) && card.hasKeyword(keyword)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java index dfa5db11642..7f03f31ddf4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java @@ -68,7 +68,7 @@ public class PumpAllAi extends PumpAiBase { valid = sa.getParam("ValidCards"); } - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); CardCollection comp = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); CardCollection human = CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); diff --git a/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java b/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java index 20f92caa50c..242e93a925a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java @@ -45,7 +45,7 @@ public class RearrangeTopOfLibraryAi extends SpellAbilityAi { // ability is targeted sa.resetTargets(); - Player opp = ComputerUtil.getOpponentFor(aiPlayer); + Player opp = aiPlayer.getWeakestOpponent(); final boolean canTgtAI = aiPlayer.canBeTargetedBy(sa); final boolean canTgtHuman = opp.canBeTargetedBy(sa); diff --git a/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java b/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java index 20d43fa814b..08059c5cace 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java @@ -15,7 +15,7 @@ public class RepeatAi extends SpellAbilityAi { protected boolean canPlayAI(Player ai, SpellAbility sa) { final Card source = sa.getHostCard(); final TargetRestrictions tgt = sa.getTargetRestrictions(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); if (tgt != null) { if (!opp.canBeTargetedBy(sa)) { @@ -49,7 +49,7 @@ public class RepeatAi extends SpellAbilityAi { protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { if (sa.usesTargeting()) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); if (sa.canTarget(opp)) { sa.resetTargets(); sa.getTargets().add(opp); diff --git a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java index 97ebb3004df..7c4c7bb441e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java @@ -63,7 +63,7 @@ public class SacrificeAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); final boolean destroy = sa.hasParam("Destroy"); - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); if (tgt != null) { sa.resetTargets(); if (!opp.canBeTargetedBy(sa)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java b/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java index 4a077ba19a1..f3abcdc257b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java @@ -37,7 +37,7 @@ public class SacrificeAllAi extends SpellAbilityAi { } CardCollection humanlist = - CardLists.getValidCards(ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source, sa); + CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source, sa); CardCollection computerlist = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source, sa); diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java index 79b627dae43..77f83383db6 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java @@ -112,7 +112,7 @@ public abstract class TapAiBase extends SpellAbilityAi { * @return a boolean. */ protected boolean tapPrefTargeting(final Player ai, final Card source, final TargetRestrictions tgt, final SpellAbility sa, final boolean mandatory) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); final Game game = ai.getGame(); CardCollection tapList = CardLists.filterControlledBy(game.getCardsIn(ZoneType.Battlefield), ai.getOpponents()); tapList = CardLists.getValidCards(tapList, tgt.getValidTgts(), source.getController(), source, sa); diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java index c61ef26a721..e2916ab249d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java @@ -30,7 +30,7 @@ public class TapAllAi extends SpellAbilityAi { // or during upkeep/begin combat? final Card source = sa.getHostCard(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); final Game game = ai.getGame(); if (game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_BEGIN)) { @@ -125,8 +125,9 @@ public class TapAllAi extends SpellAbilityAi { if (tgt != null) { sa.resetTargets(); - sa.getTargets().add(ComputerUtil.getOpponentFor(ai)); - validTappables = ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield); + Player opp = ai.getWeakestOpponent(); + sa.getTargets().add(opp); + validTappables = opp.getCardsIn(ZoneType.Battlefield); } if (mandatory) { diff --git a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java index 4a193850e01..6634e9d4a86 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java @@ -167,7 +167,7 @@ public class TokenAi extends SpellAbilityAi { */ final Card source = sa.getHostCard(); final Game game = ai.getGame(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); if (ComputerUtil.preventRunAwayActivations(sa)) { return false; // prevent infinite tokens? @@ -261,13 +261,13 @@ public class TokenAi extends SpellAbilityAi { num = (num == null) ? "1" : num; final int nToSac = AbilityUtils.calculateAmount(topStack.getHostCard(), num, topStack); CardCollection list = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), - ComputerUtil.getOpponentFor(ai), topStack.getHostCard(), sa); + ai.getWeakestOpponent(), topStack.getHostCard(), sa); list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack)); // only care about saving single creature for now if (!list.isEmpty() && nTokens > 0 && list.size() == nToSac) { ComputerUtilCard.sortByEvaluateCreature(list); list.add(token); - list = CardLists.getValidCards(list, valid.split(","), ComputerUtil.getOpponentFor(ai), topStack.getHostCard(), sa); + list = CardLists.getValidCards(list, valid.split(","), ai.getWeakestOpponent(), topStack.getHostCard(), sa); list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack)); if (ComputerUtilCard.evaluateCreature(token) < ComputerUtilCard.evaluateCreature(list.get(0)) && list.contains(token)) { @@ -285,7 +285,7 @@ public class TokenAi extends SpellAbilityAi { if (tgt != null) { sa.resetTargets(); if (tgt.canOnlyTgtOpponent()) { - sa.getTargets().add(ComputerUtil.getOpponentFor(ai)); + sa.getTargets().add(ai.getWeakestOpponent()); } else { sa.getTargets().add(ai); } diff --git a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java index 871ec928ed1..bbb46276800 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java @@ -29,7 +29,7 @@ public class TwoPilesAi extends SpellAbilityAi { valid = sa.getParam("ValidCards"); } - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { diff --git a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java index 5a105d49d00..4ce5fcc4576 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java @@ -65,7 +65,7 @@ public class UnattachAllAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { final Card card = sa.getHostCard(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); // Check if there are any valid targets List targets = new ArrayList(); final TargetRestrictions tgt = sa.getTargetRestrictions(); diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java index 7e692b9240b..48884ee524f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java @@ -139,7 +139,7 @@ public class UntapAi extends SpellAbilityAi { Player targetController = ai; if (sa.isCurse()) { - targetController = ComputerUtil.getOpponentFor(ai); + targetController = ai.getWeakestOpponent(); } CardCollection list = CardLists.getTargetableCards(targetController.getCardsIn(ZoneType.Battlefield), sa); diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java b/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java index e1b57b93bbe..782423d6e42 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java @@ -205,7 +205,7 @@ public class GameSimulator { } // TODO: Support multiple opponents. - Player opponent = ComputerUtil.getOpponentFor(aiPlayer); + Player opponent = aiPlayer.getWeakestOpponent(); resolveStack(simGame, opponent); // TODO: If this is during combat, before blockers are declared, diff --git a/forge-core/src/main/java/forge/util/ImageUtil.java b/forge-core/src/main/java/forge/util/ImageUtil.java index cd5668bb20c..1650d62725e 100644 --- a/forge-core/src/main/java/forge/util/ImageUtil.java +++ b/forge-core/src/main/java/forge/util/ImageUtil.java @@ -46,9 +46,7 @@ public class ImageUtil { cntPictures = db.getPrintCount(card.getName(), edition); hasManyPictures = cntPictures > 1; } else { - // without set number of pictures equals number of urls provided in Svar:Picture - String urls = card.getPictureUrl(backFace); - cntPictures = StringUtils.countMatches(urls, "\\") + 1; + cntPictures = 1; // raise the art index limit to the maximum of the sets this card was printed in int maxCntPictures = db.getMaxPrintCount(card.getName()); diff --git a/forge-gui-desktop/src/main/java/forge/control/FControl.java b/forge-gui-desktop/src/main/java/forge/control/FControl.java index d603c960e6c..c3bbc3f9c25 100644 --- a/forge-gui-desktop/src/main/java/forge/control/FControl.java +++ b/forge-gui-desktop/src/main/java/forge/control/FControl.java @@ -388,7 +388,7 @@ public enum FControl implements KeyEventDispatcher { return true; } } - else if (e.getID() == KeyEvent.KEY_PRESSED && e.getModifiers() == InputEvent.ALT_MASK) { + else if (e.getID() == KeyEvent.KEY_PRESSED && e.getModifiersEx() == InputEvent.ALT_DOWN_MASK) { altKeyLastDown = true; } } diff --git a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java index 3879b66185c..7eb650d1947 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java @@ -295,30 +295,10 @@ public class ImportSourceAnalyzer { // character mangling on some system locales, but we want to replicate the old code here exactly return out.toString().toLowerCase(); } - + + @Deprecated private void addDefaultPicNames(final PaperCard c, final boolean backFace) { - final CardRules card = c.getRules(); - final String urls = card.getPictureUrl(backFace); - if (StringUtils.isEmpty(urls)) { return; } - - final int numPics = 1 + StringUtils.countMatches(urls, "\\"); - if (c.getArtIndex() > numPics) { - return; - } - - final String filenameBase = ImageUtil.getImageKey(c, backFace, false); - final String filename = filenameBase + ".jpg"; - final boolean alreadyHadIt = null != defaultPicNames.put(filename, filename); - if ( alreadyHadIt ) { - return; - } - - // Do you shift artIndex by one here? - final String newLastSymbol = 0 == c.getArtIndex() ? "" : String.valueOf(c.getArtIndex() /* + 1 */); - final String oldFilename = oldCleanString(filenameBase.replaceAll("[0-9]?(\\.full)?$", "")) + newLastSymbol + ".jpg"; - //if ( numPics > 1 ) - //System.out.printf("Will move %s -> %s%n", oldFilename, filename); - defaultPicOldNameToCurrentName.put(oldFilename, filename); + return; } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java index 75cfc6418cb..dc9ad7af8f4 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java @@ -79,7 +79,7 @@ public class TextSearchFilter extends ItemFilter { itemManager.focus(); break; case KeyEvent.VK_ENTER: - if (e.getModifiers() == 0) { + if (e.getModifiersEx() == 0) { if (changeTimer.isRunning()) { applyChange(); //apply change now if currently delayed } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java index 58e774f3142..aaff5a98c15 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java @@ -327,7 +327,7 @@ public abstract class ItemView { private boolean popupShowing = false; private Popup popup; private Timer popupTimer; - private static final int okModifiers = InputEvent.SHIFT_MASK | InputEvent.ALT_GRAPH_MASK; + private static final int okModifiers = InputEvent.SHIFT_DOWN_MASK | InputEvent.ALT_GRAPH_DOWN_MASK; public IncrementalSearch() { } @@ -481,7 +481,7 @@ public abstract class ItemView { //$FALL-THROUGH$ default: // shift and/or alt-graph down is ok. anything else is a hotkey (e.g. ctrl-f) - if (okModifiers != (e.getModifiers() | okModifiers) + if (okModifiers != (e.getModifiersEx() | okModifiers) || !CharUtils.isAsciiPrintable(e.getKeyChar())) { // escape sneaks in here on Windows return; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java index bce6256d230..d616c02ef3b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java @@ -585,7 +585,7 @@ public abstract class ACEditorBase { txtScript.setDocument(doc); error = doc.addStyle("error", null); error.addAttribute(StyleConstants.Background, Color.red); - error.addAttribute(StyleConstants.Bold, new Boolean(true)); + error.addAttribute(StyleConstants.Bold, Boolean.valueOf(true)); } public JTextPane getTxtScript() { diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FUndoManager.java b/forge-gui-desktop/src/main/java/forge/toolbox/FUndoManager.java index e088eb85555..ad24d10575f 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FUndoManager.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FUndoManager.java @@ -200,8 +200,8 @@ public class FUndoManager extends UndoManager implements DocumentListener { public UndoAction() { putValue(Action.NAME, "Undo"); putValue(Action.SHORT_DESCRIPTION, getValue(Action.NAME)); - putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_U)); - putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK)); + putValue(Action.MNEMONIC_KEY, Integer.valueOf(KeyEvent.VK_U)); + putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_DOWN_MASK)); setEnabled(false); } @@ -229,8 +229,8 @@ public class FUndoManager extends UndoManager implements DocumentListener { public RedoAction() { putValue(Action.NAME, "Redo"); putValue(Action.SHORT_DESCRIPTION, getValue(Action.NAME)); - putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_R)); - putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_MASK)); + putValue(Action.MNEMONIC_KEY, Integer.valueOf(KeyEvent.VK_R)); + putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_DOWN_MASK)); setEnabled(false); } diff --git a/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java b/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java index 74dc7c3b1ad..4d9087d7b8a 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java @@ -32,6 +32,7 @@ import forge.limited.DraftRankCache; import forge.model.FModel; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.Map.Entry; public enum ColumnDef { @@ -533,7 +534,7 @@ public enum ColumnDef { Double ranking = DraftRankCache.getRanking(cp.getName(), cp.getEdition()); if (ranking != null) { if (truncate) { - return new BigDecimal(ranking).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue(); + return new BigDecimal(ranking).setScale(4, RoundingMode.HALF_UP).doubleValue(); } return ranking; } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 5865b4df7b3..15bb3a2d20e 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -523,26 +523,26 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont tempShow(delayedReveal.getCards()); } - tempShow(optionList1); - tempShow(optionList2); + tempShow(optionList1); + tempShow(optionList2); if (useSelectCardsInput(optionList1) && useSelectCardsInput(optionList2)) { final InputSelectFromTwoLists input = new InputSelectFromTwoLists(this, optional, optionList1, optionList2, sa); input.setCancelAllowed(optional); input.setMessage(MessageUtil.formatMessage(title, player, targetedPlayer)); input.showAndWait(); - endTempShowCards(); + endTempShowCards(); return (List) input.getSelected(); - } + } final GameEntityView result1 = getGui().chooseSingleEntityForEffect(title, GameEntityView.getEntityCollection(optionList1), null, optional); final GameEntityView result2 = getGui().chooseSingleEntityForEffect(title, GameEntityView.getEntityCollection(optionList2), null, (result1==null)?optional:true); endTempShowCards(); - List results = new ArrayList<>(); - GameEntity entity1 = convertToEntity(result1); - if (entity1!=null) { results.add((T) entity1); } - GameEntity entity2 = convertToEntity(result2); - if (entity2!=null) { results.add((T) entity2); } + List results = new ArrayList<>(); + GameEntity entity1 = convertToEntity(result1); + if (entity1!=null) { results.add((T) entity1); } + GameEntity entity2 = convertToEntity(result2); + if (entity2!=null) { results.add((T) entity2); } return results; } diff --git a/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java b/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java index 73c1dea1a5a..c54958a9143 100644 --- a/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java +++ b/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java @@ -17,7 +17,7 @@ public class QuestChallengeGenerator { int id = 0; for (int i=0;i<5;++i) { QuestEventChallenge qc = getFormatChallenge(FModel.getFormats().getModern()); - qc.setId(new Integer(id).toString()); + qc.setId(Integer.valueOf(id).toString()); qc.setCreditsReward(1000); qc.setWinsReqd(MyRandom.getRandom().nextInt(5)); qc.setDifficulty(QuestEventDifficulty.MEDIUM); @@ -27,7 +27,7 @@ public class QuestChallengeGenerator { } for (int i=0;i<5;++i) { QuestEventChallenge qc = getAIHeadstartChallenge(1); - qc.setId(new Integer(id).toString()); + qc.setId(Integer.valueOf(id).toString()); qc.setCreditsReward(1000); qc.setCardReward("1 multicolor rare"); qc.setWinsReqd(MyRandom.getRandom().nextInt(5)); @@ -37,7 +37,7 @@ public class QuestChallengeGenerator { } for (int i=0;i<5;++i) { QuestEventChallenge qc = getFormatChallenge(FModel.getFormats().get("Legacy")); - qc.setId(new Integer(id).toString()); + qc.setId(Integer.valueOf(id).toString()); qc.setCreditsReward(5000); qc.setCardReward("2 multicolor rares"); qc.setWinsReqd(MyRandom.getRandom().nextInt(25)); @@ -47,7 +47,7 @@ public class QuestChallengeGenerator { } for (int i=0;i<5;++i) { QuestEventChallenge qc = getAIHeadstartChallenge(2); - qc.setId(new Integer(id).toString()); + qc.setId(Integer.valueOf(id).toString()); qc.setCreditsReward(5000); qc.setCardReward("2 multicolor rares"); qc.setWinsReqd(MyRandom.getRandom().nextInt(25)); @@ -57,7 +57,7 @@ public class QuestChallengeGenerator { } for (int i=0;i<5;++i) { QuestEventChallenge qc = getFormatChallenge(FModel.getFormats().get("Vintage")); - qc.setId(new Integer(id).toString()); + qc.setId(Integer.valueOf(id).toString()); qc.setCreditsReward(10000); qc.setCardReward("3 multicolor rares"); qc.setWinsReqd(MyRandom.getRandom().nextInt(50)); @@ -67,7 +67,7 @@ public class QuestChallengeGenerator { } for (int i=0;i<5;++i) { QuestEventChallenge qc = getAIHeadstartChallenge(3); - qc.setId(new Integer(id).toString()); + qc.setId(Integer.valueOf(id).toString()); qc.setCreditsReward(10000); qc.setCardReward("3 multicolor rares"); qc.setWinsReqd(MyRandom.getRandom().nextInt(50)); diff --git a/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java index ba453988dbf..281cf71dfc7 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java @@ -64,11 +64,11 @@ public class QuestEventLDADuelManager implements QuestEventDuelManagerInterface duel.setTitle(archetype.getName()); duel.setOpponentName(archetype.getName()); QuestEventDifficulty diff = QuestEventDifficulty.EASY; - if(i <= (new Float(archetypes.size()))*.1){ + if(i <= Float.valueOf(archetypes.size())*.1){ diff = QuestEventDifficulty.EXPERT; - }else if(i <= (new Float(archetypes.size()))*.4){ + }else if(i <= Float.valueOf(archetypes.size())*.4){ diff = QuestEventDifficulty.HARD; - }else if(i <= (new Float(archetypes.size()))*.7) { + }else if(i <= Float.valueOf(archetypes.size())*.7) { diff = QuestEventDifficulty.MEDIUM; } duel.setDifficulty(diff); diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java b/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java index 2f3140de1c7..d7881334f57 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java @@ -82,7 +82,7 @@ public class QuestUtilUnlockSets { } int price = UNLOCK_COST; if (mapPrices.containsKey(TextUtil.concatNoSpace(ed.getName(), " Booster Pack"))) { - price = Math.max(new Double(30 * Math.pow(Math.sqrt(mapPrices.get(TextUtil.concatNoSpace(ed.getName(), + price = Math.max(Double.valueOf(30 * Math.pow(Math.sqrt(mapPrices.get(TextUtil.concatNoSpace(ed.getName(), " Booster Pack"))), 1.70)).intValue(), UNLOCK_COST); } price = (int) ((double) price * multiplier); diff --git a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java index 8f7b644641b..6140c1d5b64 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java @@ -17,6 +17,8 @@ */ package forge.quest.data; +import java.lang.reflect.InvocationTargetException; + import java.util.EnumMap; import java.util.HashMap; import java.util.Map; @@ -99,7 +101,7 @@ public class QuestAssets { QuestItemCondition current = this.inventoryItems.get(itemType); if (!current.getClass().equals(itemType.getModelClass())) { try { - QuestItemCondition modern = itemType.getModelClass().newInstance(); + QuestItemCondition modern = itemType.getModelClass().getDeclaredConstructor().newInstance(); modern.takeDataFrom(current); current = modern; inventoryItems.put(itemType, modern); @@ -107,6 +109,10 @@ public class QuestAssets { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); } } @@ -123,7 +129,7 @@ public class QuestAssets { QuestItemCondition cond = this.inventoryItems.get(itemType); if (null == cond) { try { // care to set appropriate state class here - cond = itemType.getModelClass().newInstance(); + cond = itemType.getModelClass().getDeclaredConstructor().newInstance(); } catch (final Exception e) { e.printStackTrace(); cond = new QuestItemCondition(); diff --git a/forge-gui/src/main/java/forge/util/AbstractGeneticAlgorithm.java b/forge-gui/src/main/java/forge/util/AbstractGeneticAlgorithm.java index 16bfdb33025..c19d45f3eb0 100644 --- a/forge-gui/src/main/java/forge/util/AbstractGeneticAlgorithm.java +++ b/forge-gui/src/main/java/forge/util/AbstractGeneticAlgorithm.java @@ -18,13 +18,13 @@ public abstract class AbstractGeneticAlgorithm { protected abstract T expandPool(); public void pruneWeakest(){ - population = population.subList(0, new Float(population.size()*pruneRatio).intValue()); + population = population.subList(0, Float.valueOf(population.size()*pruneRatio).intValue()); } protected void generateChildren(){ int prunedSize = population.size(); while(population.size()0.85f){ T child = mutateObject(population.get(randomIndex)); @@ -34,7 +34,7 @@ public abstract class AbstractGeneticAlgorithm { }else if(rand>0.70f){ int secondIndex = randomIndex; while(secondIndex != randomIndex){ - secondIndex = new Double(prunedSize*Math.pow(MyRandom.getRandom().nextDouble(), 0.25)/2d).intValue(); + secondIndex = Double.valueOf(prunedSize*Math.pow(MyRandom.getRandom().nextDouble(), 0.25)/2d).intValue(); } T child = createChild(population.get(randomIndex) , population.get(secondIndex)); diff --git a/forge-gui/src/main/java/forge/util/XmlReader.java b/forge-gui/src/main/java/forge/util/XmlReader.java index bcf544b6cbc..9b2c3eeabae 100644 --- a/forge-gui/src/main/java/forge/util/XmlReader.java +++ b/forge-gui/src/main/java/forge/util/XmlReader.java @@ -181,7 +181,7 @@ public class XmlReader { final T result; if (collectionToLoad == null) { try { - result = collectionType.newInstance(); + result = collectionType.getDeclaredConstructor().newInstance(); } catch (Exception e) { e.printStackTrace(); From ed2afd94606dd96aec7608942a289709b9529548 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Thu, 28 Feb 2019 01:04:40 +0000 Subject: [PATCH 06/39] Unused import --- forge-core/src/main/java/forge/util/ImageUtil.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/forge-core/src/main/java/forge/util/ImageUtil.java b/forge-core/src/main/java/forge/util/ImageUtil.java index 1650d62725e..fff1213d844 100644 --- a/forge-core/src/main/java/forge/util/ImageUtil.java +++ b/forge-core/src/main/java/forge/util/ImageUtil.java @@ -7,8 +7,6 @@ import forge.card.CardRules; import forge.card.CardSplitType; import forge.item.PaperCard; -import org.apache.commons.lang3.StringUtils; - public class ImageUtil { public static float getNearestHQSize(float baseSize, float actualSize) { //get nearest power of actualSize to baseSize so that the image renders good From 03e33fcc179c2c73bb6dbf84ddb016e41d12069b Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Thu, 28 Feb 2019 03:45:10 +0000 Subject: [PATCH 07/39] unused imports --- forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java | 1 - forge-ai/src/main/java/forge/ai/ability/DebuffAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java | 1 - 11 files changed, 11 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java b/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java index 47232afb6b2..634fabc1254 100644 --- a/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java @@ -2,7 +2,6 @@ package forge.ai.ability; import java.util.List; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.SpellAbilityAi; import forge.game.Game; diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java index cc28d0705b6..6d0cee69a14 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java @@ -8,7 +8,6 @@ import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilAbility; import forge.ai.ComputerUtilCard; diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java index 6d3e72ad892..d894b2f7a79 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java @@ -1,7 +1,6 @@ package forge.ai.ability; import com.google.common.collect.Iterables; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCombat; import forge.ai.SpellAbilityAi; import forge.game.Game; diff --git a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java index fa4b85d6588..ca3fae2f3a8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java @@ -4,7 +4,6 @@ import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilCost; import forge.ai.SpellAbilityAi; diff --git a/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java b/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java index a383afa8c97..f6745d73c39 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.ability.AbilityUtils; import forge.game.card.Card; diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java index 6514d570595..8b387b7791a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.player.Player; import forge.game.spellability.SpellAbility; diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java index 4603cc998d9..cc4d851bd9b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilAbility; import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; diff --git a/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java index 1d3cceaf8c6..1db4d76d321 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java @@ -2,7 +2,6 @@ package forge.ai.ability; import com.google.common.base.Predicate; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.SpellAbilityAi; import forge.game.ability.AbilityUtils; diff --git a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java index 7c4c7bb441e..f5f1c587075 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; diff --git a/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java b/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java index f3abcdc257b..8032c127eed 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilCost; import forge.ai.ComputerUtilMana; diff --git a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java index 4ce5fcc4576..6b7ad4eefbe 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; From cb69f06a4bd364cc410d79bf89345d4c29231a50 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Thu, 28 Feb 2019 04:01:21 +0000 Subject: [PATCH 08/39] unused imports --- forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/BalanceAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/GameLossAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/TapAllAi.java | 1 - forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java | 1 - 10 files changed, 10 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java index ac7176b2aea..44780ec2e94 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.ability.AbilityUtils; import forge.game.card.Card; diff --git a/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java b/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java index 25ff20577bb..9aba6e53fe9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java index 41e7024af58..46276414778 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.player.Player; import forge.game.spellability.SpellAbility; diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java index 1357193ec82..3478e74b73b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java @@ -7,7 +7,6 @@ import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilCombat; import forge.ai.ComputerUtilCost; diff --git a/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java index 3aadb95d5c1..f21b327b3fd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java @@ -3,7 +3,6 @@ package forge.ai.ability; import com.google.common.base.Predicate; import com.google.common.collect.Lists; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.SpellAbilityAi; import forge.game.ability.AbilityUtils; diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java index da77baf1e71..0be541d2f5f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java @@ -2,7 +2,6 @@ package forge.ai.ability; import com.google.common.base.Predicate; import com.google.common.collect.Lists; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCost; import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; diff --git a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java index 7464466ca17..f18dc3c7784 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; import forge.game.card.Card; diff --git a/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java b/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java index 9a06fdc02c1..03b77143d99 100644 --- a/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.player.Player; import forge.game.spellability.SpellAbility; diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java index e2916ab249d..8744ade29f0 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java @@ -3,7 +3,6 @@ package forge.ai.ability; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCombat; import forge.ai.SpellAbilityAi; import forge.game.Game; diff --git a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java index bbb46276800..1589ec3f41d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java @@ -2,7 +2,6 @@ package forge.ai.ability; import java.util.List; -import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.ability.AbilityUtils; import forge.game.card.Card; From 730fa75ed2fa6873a3329b243990288c319c692e Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Thu, 28 Feb 2019 04:06:08 +0000 Subject: [PATCH 09/39] unused import --- .../src/main/java/forge/gui/ImportSourceAnalyzer.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java index 7eb650d1947..c19d9c5b10f 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java @@ -20,7 +20,6 @@ package forge.gui; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import forge.card.CardEdition; -import forge.card.CardRules; import forge.item.IPaperCard; import forge.item.PaperCard; import forge.model.FModel; From 4e9b3ce256861e4fb5409095fa7bc922181602f4 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Wed, 12 Jun 2019 20:10:26 +0000 Subject: [PATCH 10/39] Update README.txt for release --- forge-gui/README.txt | 87 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/forge-gui/README.txt b/forge-gui/README.txt index 11b369846f2..9ff2d9d7dad 100644 --- a/forge-gui/README.txt +++ b/forge-gui/README.txt @@ -1 +1,86 @@ -This file is automatically updated by our release bot on Discord, Blacksmith. It is created from the files present in the 'release-files' directory. Please do not hand-edit this file if using the bot to perform a release, as your changes will be overwritten. \ No newline at end of file +Forge: 06/12/2019 ver 1.6.26 + +18938 cards in total. + + +-------------- +Release Notes: +-------------- + +- New Cards - +Balduvian Warlord; False Orders + +- New Net Deck Category - +The Genetic Algorithm AI Decks category has been added to net decks. This contains decks generated using a genetic algorithm to try to find decks that the AI plays best in each format. + +- Bug fixes - +As always, this release of Forge features an assortment of bug fixes and improvements based on user feedback during the previous release run. + +------------- +Known Issues: +------------- + +Known issues are here: https://git.cardforge.org/core-developers/forge/issues + +Feel free to report your own there if you have any. + +------------- +Installation: +------------- + +The Forge archive includes a MANUAL.txt file and we ask that you spend a few minutes reading this file as it contains some information that may prove useful. We do tend to update this file at times and you should quickly read this file and look for new information for each and every new release. Thank you. + +The archive format used for the Forge distribution is ".tar.bz2". There are utilities for Windows, Mac OS and the various *nix's that can be used to extract/decompress these ".tar.bz2" archives. We recommend that you extract/decompress the Forge archive into a new and unused folder. + +Some people use the Windows application 7zip. This utility can be found at http://www.7-zip.org/download.html. Mac users can double click on the archive and the application Archive Utility will launch and extract the archive. Mac users do not need to download a separate utility. + +Once the Forge archive has been decompressed you should then be able to launch Forge by using the included launcher. Launching Forge by double clicking on the forge jar file in the past caused a java heap space error. Forge's memory requirements have increased over time and the launchers increase the java heap space available to Forge. Currently you can launch Forge by double clicking on the forge jar file without a java heap space error but this is likely to change as we add in more sounds, icons, etc. + +- The Mac OS application version - +We provide separate macOS builds of desktop and mobile (backported) Forge packaged as native Mac applications. Please check the relevant thread for details and download links. + + +- Online Multiplayer - +For local network play you should only need two systems running Forge. One to host and one to join and play. For remote (over the Internet) play you will need to ensure that the port used (36743 by default) is forwarded to the hosting machine. + +-------------------- +Active Contributors: +-------------------- + +Agetian +apantel +Austinio7116 +Churrufli +DrDev +excessum +Flair +Gos +Hanmac +Indigo Dragon +Jamin Collins +KrazyTheFox +Luke +Marek14 +mcrawford620 +Meerkov +Myrd +nefigah +OgreBattlecruiser +pfps +Seravy +Sirspud +Sloth +slyfox7777777 +Sol +Swordshine +tjtillman +tojammot +torridus +Xyx +Zuchinni + +(If you think your name should be on this list, add it with your next contribution) + +(Quest icons used created by Teekatas, from his Legendora set http://raindropmemory.deviantart.com) +(Thanks to the XMage team for permission to use their targeting arrows.) +(Thanks to http://www.freesound.org/browse/ for providing some sound files.) \ No newline at end of file From 2974f6a7c3c9ce9833f94ac649050c6732e21398 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Wed, 12 Jun 2019 20:12:56 +0000 Subject: [PATCH 11/39] [maven-release-plugin] prepare release forge-1.6.26 --- forge-ai/pom.xml | 2 +- forge-core/pom.xml | 2 +- forge-game/pom.xml | 2 +- forge-gui-android/pom.xml | 2 +- forge-gui-desktop/pom.xml | 2 +- forge-gui-ios/pom.xml | 2 +- forge-gui-mobile-dev/pom.xml | 2 +- forge-gui-mobile/pom.xml | 2 +- forge-gui/pom.xml | 2 +- pom.xml | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/forge-ai/pom.xml b/forge-ai/pom.xml index ec14ef4f065..fb8de3e3d0c 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.26-SNAPSHOT + 1.6.26 forge-ai diff --git a/forge-core/pom.xml b/forge-core/pom.xml index 8a79508056a..b0ae7835adb 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.26-SNAPSHOT + 1.6.26 forge-core diff --git a/forge-game/pom.xml b/forge-game/pom.xml index 1133ec9e0f9..3ca03778b36 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.26-SNAPSHOT + 1.6.26 forge-game diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 5633bacc26c..ab0c3ed66d1 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -19,7 +19,7 @@ forge forge - 1.6.26-SNAPSHOT + 1.6.26 forge-gui-android diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index 13d08231132..e4db418d185 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.26-SNAPSHOT + 1.6.26 forge-gui-desktop diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index bdd558aacb8..43ab78b04ec 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -12,7 +12,7 @@ forge forge - 1.6.26-SNAPSHOT + 1.6.26 forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 6aaa483d474..06c4823ba62 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.26-SNAPSHOT + 1.6.26 forge-gui-mobile-dev diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index d0e1c628b54..14b51150ff1 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.26-SNAPSHOT + 1.6.26 forge-gui-mobile diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index e2602b9e7d3..f622525cf31 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.26-SNAPSHOT + 1.6.26 forge-gui diff --git a/pom.xml b/pom.xml index 9c0b3538532..227339cded3 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ forge pom Forge Parent - 1.6.26-SNAPSHOT + 1.6.26 Forge lets you play the card game Magic: The Gathering against a computer opponent using all of the rules. @@ -175,7 +175,7 @@ scm:git:ssh://git@git.cardforge.org/core-developers/forge.git scm:git:ssh://git@git.cardforge.org/core-developers/forge.git - HEAD + forge-1.6.26 From 560fdf1a461b09598180aed296501f98b8d8b803 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Wed, 12 Jun 2019 20:13:01 +0000 Subject: [PATCH 12/39] [maven-release-plugin] prepare for next development iteration --- forge-ai/pom.xml | 2 +- forge-core/pom.xml | 2 +- forge-game/pom.xml | 2 +- forge-gui-android/pom.xml | 2 +- forge-gui-desktop/pom.xml | 2 +- forge-gui-ios/pom.xml | 2 +- forge-gui-mobile-dev/pom.xml | 2 +- forge-gui-mobile/pom.xml | 2 +- forge-gui/pom.xml | 2 +- pom.xml | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/forge-ai/pom.xml b/forge-ai/pom.xml index fb8de3e3d0c..86ceb211dab 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.26 + 1.6.27-SNAPSHOT forge-ai diff --git a/forge-core/pom.xml b/forge-core/pom.xml index b0ae7835adb..b7a37945a7b 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.26 + 1.6.27-SNAPSHOT forge-core diff --git a/forge-game/pom.xml b/forge-game/pom.xml index 3ca03778b36..7b6e798417a 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.26 + 1.6.27-SNAPSHOT forge-game diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index ab0c3ed66d1..3ef58a4cec2 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -19,7 +19,7 @@ forge forge - 1.6.26 + 1.6.27-SNAPSHOT forge-gui-android diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index e4db418d185..a46c9d91fd3 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.26 + 1.6.27-SNAPSHOT forge-gui-desktop diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 43ab78b04ec..5a7d9e146ca 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -12,7 +12,7 @@ forge forge - 1.6.26 + 1.6.27-SNAPSHOT forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 06c4823ba62..72e6d85ba06 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.26 + 1.6.27-SNAPSHOT forge-gui-mobile-dev diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index 14b51150ff1..00726e8d5dc 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.26 + 1.6.27-SNAPSHOT forge-gui-mobile diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index f622525cf31..d93a5621274 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.26 + 1.6.27-SNAPSHOT forge-gui diff --git a/pom.xml b/pom.xml index 227339cded3..c3d837508c5 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ forge pom Forge Parent - 1.6.26 + 1.6.27-SNAPSHOT Forge lets you play the card game Magic: The Gathering against a computer opponent using all of the rules. @@ -175,7 +175,7 @@ scm:git:ssh://git@git.cardforge.org/core-developers/forge.git scm:git:ssh://git@git.cardforge.org/core-developers/forge.git - forge-1.6.26 + HEAD From 803e82f5f839f792828cddf6f2c20c6330f033c0 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Wed, 12 Jun 2019 20:18:07 +0000 Subject: [PATCH 13/39] Clear out release files in preparation for next release --- forge-gui/README.txt | 87 +---------------------------- forge-gui/release-files/CHANGES.txt | 3 - 2 files changed, 1 insertion(+), 89 deletions(-) diff --git a/forge-gui/README.txt b/forge-gui/README.txt index 9ff2d9d7dad..11b369846f2 100644 --- a/forge-gui/README.txt +++ b/forge-gui/README.txt @@ -1,86 +1 @@ -Forge: 06/12/2019 ver 1.6.26 - -18938 cards in total. - - --------------- -Release Notes: --------------- - -- New Cards - -Balduvian Warlord; False Orders - -- New Net Deck Category - -The Genetic Algorithm AI Decks category has been added to net decks. This contains decks generated using a genetic algorithm to try to find decks that the AI plays best in each format. - -- Bug fixes - -As always, this release of Forge features an assortment of bug fixes and improvements based on user feedback during the previous release run. - -------------- -Known Issues: -------------- - -Known issues are here: https://git.cardforge.org/core-developers/forge/issues - -Feel free to report your own there if you have any. - -------------- -Installation: -------------- - -The Forge archive includes a MANUAL.txt file and we ask that you spend a few minutes reading this file as it contains some information that may prove useful. We do tend to update this file at times and you should quickly read this file and look for new information for each and every new release. Thank you. - -The archive format used for the Forge distribution is ".tar.bz2". There are utilities for Windows, Mac OS and the various *nix's that can be used to extract/decompress these ".tar.bz2" archives. We recommend that you extract/decompress the Forge archive into a new and unused folder. - -Some people use the Windows application 7zip. This utility can be found at http://www.7-zip.org/download.html. Mac users can double click on the archive and the application Archive Utility will launch and extract the archive. Mac users do not need to download a separate utility. - -Once the Forge archive has been decompressed you should then be able to launch Forge by using the included launcher. Launching Forge by double clicking on the forge jar file in the past caused a java heap space error. Forge's memory requirements have increased over time and the launchers increase the java heap space available to Forge. Currently you can launch Forge by double clicking on the forge jar file without a java heap space error but this is likely to change as we add in more sounds, icons, etc. - -- The Mac OS application version - -We provide separate macOS builds of desktop and mobile (backported) Forge packaged as native Mac applications. Please check the relevant thread for details and download links. - - -- Online Multiplayer - -For local network play you should only need two systems running Forge. One to host and one to join and play. For remote (over the Internet) play you will need to ensure that the port used (36743 by default) is forwarded to the hosting machine. - --------------------- -Active Contributors: --------------------- - -Agetian -apantel -Austinio7116 -Churrufli -DrDev -excessum -Flair -Gos -Hanmac -Indigo Dragon -Jamin Collins -KrazyTheFox -Luke -Marek14 -mcrawford620 -Meerkov -Myrd -nefigah -OgreBattlecruiser -pfps -Seravy -Sirspud -Sloth -slyfox7777777 -Sol -Swordshine -tjtillman -tojammot -torridus -Xyx -Zuchinni - -(If you think your name should be on this list, add it with your next contribution) - -(Quest icons used created by Teekatas, from his Legendora set http://raindropmemory.deviantart.com) -(Thanks to the XMage team for permission to use their targeting arrows.) -(Thanks to http://www.freesound.org/browse/ for providing some sound files.) \ No newline at end of file +This file is automatically updated by our release bot on Discord, Blacksmith. It is created from the files present in the 'release-files' directory. Please do not hand-edit this file if using the bot to perform a release, as your changes will be overwritten. \ No newline at end of file diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 498ee89e95b..05f0bf1829e 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,5 +1,2 @@ -- New Net Deck Category - -The Genetic Algorithm AI Decks category has been added to net decks. This contains decks generated using a genetic algorithm to try to find decks that the AI plays best in each format. - - Bug fixes - As always, this release of Forge features an assortment of bug fixes and improvements based on user feedback during the previous release run. From 83ba31a6cd7c14de8e851f5aa4bf5b2112fe5b8c Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 13 Jun 2019 06:21:23 +0300 Subject: [PATCH 14/39] - Preparing Forge for Android publish 1.6.26.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 3ef58a4cec2..7ad73ededae 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.25.001 + 1.6.26.001 keystore alias storepass diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 5a7d9e146ca..6cf49bae10c 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx2048m - 1.6.25.001 + 1.6.26.001 diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 8594963adcb..cb2b1720c95 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -34,7 +34,7 @@ import java.util.List; import java.util.Stack; public class Forge implements ApplicationListener { - public static final String CURRENT_VERSION = "1.6.25.001"; + public static final String CURRENT_VERSION = "1.6.26.001"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; From 7f3da042eabf9ab4b7adc7454587e28ffa69e619 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 13 Jun 2019 07:04:47 +0300 Subject: [PATCH 15/39] - Migrate "upcoming" for MH1 in preparation for the upcoming M20 development. --- forge-gui/res/cardsfolder/{upcoming => a}/abominable_treefolk.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/alpine_guide.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/amorphous_axe.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/answered_prayers.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/archmages_charm.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/arcums_astrolabe.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/aria_of_flame.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/astral_drift.txt | 0 .../res/cardsfolder/{upcoming => a}/ayula_queen_among_bears.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/ayulas_influence.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/azra_smokeshaper.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/bazaar_trademage.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/bellowing_elk.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/birthing_boughs.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/bladeback_sliver.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/blizzard_strix.txt | 0 .../res/cardsfolder/{upcoming => b}/bogardan_dragonheart.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/cabal_therapist.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/cave_of_temptation.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/changeling_outcast.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/chillerpillar.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/cleaving_sliver.txt | 0 .../res/cardsfolder/{upcoming => c}/cloudshredder_sliver.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/collected_conjuring.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/collector_ouphe.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/conifer_wurm.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/cordial_vampire.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/crashing_footfalls.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/cunning_evasion.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dead_of_winter.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/deep_forest_hermit.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/defile.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dregscape_sliver.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/echo_of_eons.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/endling.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/enduring_sliver.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/ephemerate.txt | 0 .../res/cardsfolder/{upcoming => e}/etchings_of_the_chosen.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/everdream.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/excavating_anurid.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/eyekite.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/face_of_divinity.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/faerie_seer.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/fallen_shinobi.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/farmstead_gleaner.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/feaster_of_fools.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/fiery_islet.txt | 0 .../res/cardsfolder/{upcoming => f}/first_slivers_chosen.txt | 0 .../res/cardsfolder/{upcoming => f}/first_sphere_gargantua.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/fists_of_flame.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/force_of_despair.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/force_of_negation.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/force_of_rage.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/force_of_vigor.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/force_of_virtue.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/fountain_of_ichor.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/frostwalk_bastion.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/frostwalla.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/generous_gift.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/geomancers_gambit.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/giver_of_runes.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/glacial_revelation.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gluttonous_slug.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/goatnap.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/goblin_champion.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/goblin_engineer.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/goblin_oriflamme.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/goblin_war_party.txt | 0 .../res/cardsfolder/{upcoming => g}/good_fortune_unicorn.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/graveshifter.txt | 0 .../cardsfolder/{upcoming => h}/hall_of_heliods_generosity.txt | 0 forge-gui/res/cardsfolder/{upcoming => h}/headless_specter.txt | 0 forge-gui/res/cardsfolder/{upcoming => h}/hexdrinker.txt | 0 .../res/cardsfolder/{upcoming => h}/hogaak_arisen_necropolis.txt | 0 forge-gui/res/cardsfolder/{upcoming => h}/hollowhead_sliver.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/ice_fang_coatl.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/iceberg_cancrix.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/icehide_golem.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/igneous_elemental.txt | 0 .../cardsfolder/{upcoming => i}/impostor_of_the_sixth_pride.txt | 0 .../res/cardsfolder/{upcoming => i}/ingenious_infiltrator.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/irregular_cohort.txt | 0 forge-gui/res/cardsfolder/{upcoming => k}/kayas_guile.txt | 0 forge-gui/res/cardsfolder/{upcoming => k}/king_of_the_pride.txt | 0 .../res/cardsfolder/{upcoming => k}/knight_of_old_benalia.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/lancer_sliver.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/lavabelly_sliver.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/lesser_masticore.txt | 0 .../res/cardsfolder/{upcoming => l}/lightning_skelemental.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/llanowar_tribe.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/magmatic_sinkhole.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/marit_lages_slumber.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/martyrs_soul.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mind_rake.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mirrodin_besieged.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mist_syndicate_naga.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mob.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/moonblade_shinobi.txt | 0 .../res/cardsfolder/{upcoming => m}/morophon_the_boundless.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mother_bear.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mox_tantalite.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/munitions_expert.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/murasa_behemoth.txt | 0 forge-gui/res/cardsfolder/{upcoming => n}/natures_chant.txt | 0 .../res/cardsfolder/{upcoming => n}/ninja_of_the_new_moon.txt | 0 forge-gui/res/cardsfolder/{upcoming => n}/nurturing_peatland.txt | 0 forge-gui/res/cardsfolder/{upcoming => o}/on_thin_ice.txt | 0 forge-gui/res/cardsfolder/{upcoming => o}/oneirophage.txt | 0 forge-gui/res/cardsfolder/{upcoming => o}/orcish_hellraiser.txt | 0 forge-gui/res/cardsfolder/{upcoming => o}/ore_scale_guardian.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/pashalik_mons.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/phantasmal_form.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/phantom_ninja.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/plague_engineer.txt | 0 .../res/cardsfolder/{upcoming => p}/planebound_accomplice.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/pondering_mage.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/prismatic_vista.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/putrid_goblin.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/pyrophobia.txt | 0 forge-gui/res/cardsfolder/{upcoming => q}/quakefoot_cyclops.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rain_of_revelation.txt | 0 .../res/cardsfolder/{upcoming => r}/ranger_captain_of_eos.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rank_officer.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/ransack_the_lab.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/ravenous_giant.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/reap_the_past.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/recruit_the_worthy.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/reprobation.txt | 0 .../res/cardsfolder/{upcoming => r}/return_from_extinction.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rhox_veteran.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rime_tender.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rotwidow_pack.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/ruination_rioter.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/saddled_rimestag.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sadistic_obsession.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/savage_swipe.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/scale_up.txt | 0 .../res/cardsfolder/{upcoming => s}/scour_all_possibilities.txt | 0 .../res/cardsfolder/{upcoming => s}/scrapyard_recombiner.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/scuttling_sliver.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/seasoned_pyromancer.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/segovian_angel.txt | 0 .../res/cardsfolder/{upcoming => s}/serra_the_benevolent.txt | 0 .../res/cardsfolder/{upcoming => s}/settle_beyond_reality.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/shatter_assumptions.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/shenanigans.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/silent_clearing.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/silumgar_scavenger.txt | 0 .../cardsfolder/{upcoming => s}/sisay_weatherlight_captain.txt | 0 .../res/cardsfolder/{upcoming => s}/sling_gang_lieutenant.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/smiting_helix.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/smoke_shroud.txt | 0 .../res/cardsfolder/{upcoming => s}/soul_strike_technique.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/soulherder.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/spell_snuff.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/spinehorn_minotaur.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/spiteful_sliver.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/splicers_skill.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/springbloom_druid.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/stirring_address.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/stream_of_thought.txt | 0 .../res/cardsfolder/{upcoming => s}/string_of_disappearances.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sunbaked_canyon.txt | 0 .../res/cardsfolder/{upcoming => s}/sword_of_sinew_and_steel.txt | 0 .../cardsfolder/{upcoming => s}/sword_of_truth_and_justice.txt | 0 .../res/cardsfolder/{upcoming => t}/talisman_of_conviction.txt | 0 .../res/cardsfolder/{upcoming => t}/talisman_of_creativity.txt | 0 .../res/cardsfolder/{upcoming => t}/talisman_of_curiosity.txt | 0 .../res/cardsfolder/{upcoming => t}/talisman_of_hierarchy.txt | 0 .../res/cardsfolder/{upcoming => t}/talisman_of_resilience.txt | 0 .../res/cardsfolder/{upcoming => t}/tectonic_reformation.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/tempered_sliver.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/the_first_sliver.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/thornado.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/throatseeker.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/throes_of_chaos.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/thundering_djinn.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/treefolk_umbra.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/treetop_ambusher.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/tribute_mage.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/trumpeting_herd.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/trustworthy_scout.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/twin_silk_spider.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/twisted_reflection.txt | 0 forge-gui/res/cardsfolder/{upcoming => u}/umezawas_charm.txt | 0 forge-gui/res/cardsfolder/{upcoming => u}/unbound_flourishing.txt | 0 forge-gui/res/cardsfolder/{upcoming => u}/undead_augur.txt | 0 forge-gui/res/cardsfolder/{upcoming => u}/universal_automaton.txt | 0 forge-gui/res/cardsfolder/{upcoming => u}/unsettled_mariner.txt | 0 .../res/cardsfolder/{upcoming => u}/urza_lord_high_artificer.txt | 0 forge-gui/res/cardsfolder/{upcoming => v}/valiant_changeling.txt | 0 forge-gui/res/cardsfolder/{upcoming => v}/vengeful_devil.txt | 0 forge-gui/res/cardsfolder/{upcoming => v}/venomous_changeling.txt | 0 forge-gui/res/cardsfolder/{upcoming => v}/vesperlark.txt | 0 .../res/cardsfolder/{upcoming => v}/viashino_sandsprinter.txt | 0 forge-gui/res/cardsfolder/{upcoming => v}/volatile_claws.txt | 0 .../res/cardsfolder/{upcoming => w}/wall_of_one_thousand_cuts.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/warteye_witch.txt | 0 .../res/cardsfolder/{upcoming => w}/watcher_for_tomorrow.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/waterlogged_grove.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/weather_the_storm.txt | 0 .../res/cardsfolder/{upcoming => w}/webweaver_changeling.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/windcaller_aven.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/winding_way.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/winds_of_abandon.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/winters_rest.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/wrenn_and_six.txt | 0 .../res/cardsfolder/{upcoming => y}/yawgmoth_thran_physician.txt | 0 forge-gui/res/cardsfolder/{upcoming => z}/zhalfirin_decoy.txt | 0 209 files changed, 0 insertions(+), 0 deletions(-) rename forge-gui/res/cardsfolder/{upcoming => a}/abominable_treefolk.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/alpine_guide.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/amorphous_axe.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/answered_prayers.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/archmages_charm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/arcums_astrolabe.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/aria_of_flame.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/astral_drift.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/ayula_queen_among_bears.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/ayulas_influence.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/azra_smokeshaper.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/bazaar_trademage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/bellowing_elk.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/birthing_boughs.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/bladeback_sliver.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/blizzard_strix.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/bogardan_dragonheart.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cabal_therapist.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cave_of_temptation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/changeling_outcast.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/chillerpillar.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cleaving_sliver.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cloudshredder_sliver.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/collected_conjuring.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/collector_ouphe.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/conifer_wurm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cordial_vampire.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/crashing_footfalls.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cunning_evasion.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dead_of_winter.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/deep_forest_hermit.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/defile.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dregscape_sliver.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/echo_of_eons.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/endling.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/enduring_sliver.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/ephemerate.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/etchings_of_the_chosen.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/everdream.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/excavating_anurid.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/eyekite.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/face_of_divinity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/faerie_seer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/fallen_shinobi.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/farmstead_gleaner.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/feaster_of_fools.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/fiery_islet.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/first_slivers_chosen.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/first_sphere_gargantua.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/fists_of_flame.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/force_of_despair.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/force_of_negation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/force_of_rage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/force_of_vigor.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/force_of_virtue.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/fountain_of_ichor.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/frostwalk_bastion.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/frostwalla.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/generous_gift.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/geomancers_gambit.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/giver_of_runes.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/glacial_revelation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gluttonous_slug.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/goatnap.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/goblin_champion.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/goblin_engineer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/goblin_oriflamme.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/goblin_war_party.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/good_fortune_unicorn.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/graveshifter.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/hall_of_heliods_generosity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/headless_specter.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/hexdrinker.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/hogaak_arisen_necropolis.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/hollowhead_sliver.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/ice_fang_coatl.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/iceberg_cancrix.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/icehide_golem.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/igneous_elemental.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/impostor_of_the_sixth_pride.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/ingenious_infiltrator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/irregular_cohort.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/kayas_guile.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/king_of_the_pride.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/knight_of_old_benalia.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/lancer_sliver.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/lavabelly_sliver.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/lesser_masticore.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/lightning_skelemental.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/llanowar_tribe.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/magmatic_sinkhole.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/marit_lages_slumber.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/martyrs_soul.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mind_rake.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mirrodin_besieged.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mist_syndicate_naga.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mob.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/moonblade_shinobi.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/morophon_the_boundless.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mother_bear.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mox_tantalite.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/munitions_expert.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/murasa_behemoth.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => n}/natures_chant.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => n}/ninja_of_the_new_moon.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => n}/nurturing_peatland.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => o}/on_thin_ice.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => o}/oneirophage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => o}/orcish_hellraiser.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => o}/ore_scale_guardian.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pashalik_mons.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/phantasmal_form.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/phantom_ninja.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/plague_engineer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/planebound_accomplice.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pondering_mage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/prismatic_vista.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/putrid_goblin.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pyrophobia.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => q}/quakefoot_cyclops.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rain_of_revelation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/ranger_captain_of_eos.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rank_officer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/ransack_the_lab.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/ravenous_giant.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/reap_the_past.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/recruit_the_worthy.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/reprobation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/return_from_extinction.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rhox_veteran.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rime_tender.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rotwidow_pack.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/ruination_rioter.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/saddled_rimestag.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sadistic_obsession.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/savage_swipe.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/scale_up.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/scour_all_possibilities.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/scrapyard_recombiner.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/scuttling_sliver.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/seasoned_pyromancer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/segovian_angel.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/serra_the_benevolent.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/settle_beyond_reality.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/shatter_assumptions.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/shenanigans.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/silent_clearing.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/silumgar_scavenger.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sisay_weatherlight_captain.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sling_gang_lieutenant.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/smiting_helix.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/smoke_shroud.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/soul_strike_technique.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/soulherder.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/spell_snuff.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/spinehorn_minotaur.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/spiteful_sliver.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/splicers_skill.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/springbloom_druid.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/stirring_address.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/stream_of_thought.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/string_of_disappearances.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sunbaked_canyon.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sword_of_sinew_and_steel.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sword_of_truth_and_justice.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/talisman_of_conviction.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/talisman_of_creativity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/talisman_of_curiosity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/talisman_of_hierarchy.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/talisman_of_resilience.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/tectonic_reformation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/tempered_sliver.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/the_first_sliver.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/thornado.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/throatseeker.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/throes_of_chaos.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/thundering_djinn.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/treefolk_umbra.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/treetop_ambusher.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/tribute_mage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/trumpeting_herd.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/trustworthy_scout.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/twin_silk_spider.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/twisted_reflection.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/umezawas_charm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/unbound_flourishing.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/undead_augur.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/universal_automaton.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/unsettled_mariner.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/urza_lord_high_artificer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/valiant_changeling.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/vengeful_devil.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/venomous_changeling.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/vesperlark.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/viashino_sandsprinter.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/volatile_claws.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/wall_of_one_thousand_cuts.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/warteye_witch.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/watcher_for_tomorrow.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/waterlogged_grove.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/weather_the_storm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/webweaver_changeling.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/windcaller_aven.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/winding_way.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/winds_of_abandon.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/winters_rest.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/wrenn_and_six.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => y}/yawgmoth_thran_physician.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => z}/zhalfirin_decoy.txt (100%) diff --git a/forge-gui/res/cardsfolder/upcoming/abominable_treefolk.txt b/forge-gui/res/cardsfolder/a/abominable_treefolk.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/abominable_treefolk.txt rename to forge-gui/res/cardsfolder/a/abominable_treefolk.txt diff --git a/forge-gui/res/cardsfolder/upcoming/alpine_guide.txt b/forge-gui/res/cardsfolder/a/alpine_guide.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/alpine_guide.txt rename to forge-gui/res/cardsfolder/a/alpine_guide.txt diff --git a/forge-gui/res/cardsfolder/upcoming/amorphous_axe.txt b/forge-gui/res/cardsfolder/a/amorphous_axe.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/amorphous_axe.txt rename to forge-gui/res/cardsfolder/a/amorphous_axe.txt diff --git a/forge-gui/res/cardsfolder/upcoming/answered_prayers.txt b/forge-gui/res/cardsfolder/a/answered_prayers.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/answered_prayers.txt rename to forge-gui/res/cardsfolder/a/answered_prayers.txt diff --git a/forge-gui/res/cardsfolder/upcoming/archmages_charm.txt b/forge-gui/res/cardsfolder/a/archmages_charm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/archmages_charm.txt rename to forge-gui/res/cardsfolder/a/archmages_charm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/arcums_astrolabe.txt b/forge-gui/res/cardsfolder/a/arcums_astrolabe.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/arcums_astrolabe.txt rename to forge-gui/res/cardsfolder/a/arcums_astrolabe.txt diff --git a/forge-gui/res/cardsfolder/upcoming/aria_of_flame.txt b/forge-gui/res/cardsfolder/a/aria_of_flame.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/aria_of_flame.txt rename to forge-gui/res/cardsfolder/a/aria_of_flame.txt diff --git a/forge-gui/res/cardsfolder/upcoming/astral_drift.txt b/forge-gui/res/cardsfolder/a/astral_drift.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/astral_drift.txt rename to forge-gui/res/cardsfolder/a/astral_drift.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ayula_queen_among_bears.txt b/forge-gui/res/cardsfolder/a/ayula_queen_among_bears.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ayula_queen_among_bears.txt rename to forge-gui/res/cardsfolder/a/ayula_queen_among_bears.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ayulas_influence.txt b/forge-gui/res/cardsfolder/a/ayulas_influence.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ayulas_influence.txt rename to forge-gui/res/cardsfolder/a/ayulas_influence.txt diff --git a/forge-gui/res/cardsfolder/upcoming/azra_smokeshaper.txt b/forge-gui/res/cardsfolder/a/azra_smokeshaper.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/azra_smokeshaper.txt rename to forge-gui/res/cardsfolder/a/azra_smokeshaper.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bazaar_trademage.txt b/forge-gui/res/cardsfolder/b/bazaar_trademage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bazaar_trademage.txt rename to forge-gui/res/cardsfolder/b/bazaar_trademage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bellowing_elk.txt b/forge-gui/res/cardsfolder/b/bellowing_elk.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bellowing_elk.txt rename to forge-gui/res/cardsfolder/b/bellowing_elk.txt diff --git a/forge-gui/res/cardsfolder/upcoming/birthing_boughs.txt b/forge-gui/res/cardsfolder/b/birthing_boughs.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/birthing_boughs.txt rename to forge-gui/res/cardsfolder/b/birthing_boughs.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bladeback_sliver.txt b/forge-gui/res/cardsfolder/b/bladeback_sliver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bladeback_sliver.txt rename to forge-gui/res/cardsfolder/b/bladeback_sliver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/blizzard_strix.txt b/forge-gui/res/cardsfolder/b/blizzard_strix.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/blizzard_strix.txt rename to forge-gui/res/cardsfolder/b/blizzard_strix.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bogardan_dragonheart.txt b/forge-gui/res/cardsfolder/b/bogardan_dragonheart.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bogardan_dragonheart.txt rename to forge-gui/res/cardsfolder/b/bogardan_dragonheart.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cabal_therapist.txt b/forge-gui/res/cardsfolder/c/cabal_therapist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cabal_therapist.txt rename to forge-gui/res/cardsfolder/c/cabal_therapist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cave_of_temptation.txt b/forge-gui/res/cardsfolder/c/cave_of_temptation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cave_of_temptation.txt rename to forge-gui/res/cardsfolder/c/cave_of_temptation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/changeling_outcast.txt b/forge-gui/res/cardsfolder/c/changeling_outcast.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/changeling_outcast.txt rename to forge-gui/res/cardsfolder/c/changeling_outcast.txt diff --git a/forge-gui/res/cardsfolder/upcoming/chillerpillar.txt b/forge-gui/res/cardsfolder/c/chillerpillar.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/chillerpillar.txt rename to forge-gui/res/cardsfolder/c/chillerpillar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cleaving_sliver.txt b/forge-gui/res/cardsfolder/c/cleaving_sliver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cleaving_sliver.txt rename to forge-gui/res/cardsfolder/c/cleaving_sliver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cloudshredder_sliver.txt b/forge-gui/res/cardsfolder/c/cloudshredder_sliver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cloudshredder_sliver.txt rename to forge-gui/res/cardsfolder/c/cloudshredder_sliver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/collected_conjuring.txt b/forge-gui/res/cardsfolder/c/collected_conjuring.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/collected_conjuring.txt rename to forge-gui/res/cardsfolder/c/collected_conjuring.txt diff --git a/forge-gui/res/cardsfolder/upcoming/collector_ouphe.txt b/forge-gui/res/cardsfolder/c/collector_ouphe.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/collector_ouphe.txt rename to forge-gui/res/cardsfolder/c/collector_ouphe.txt diff --git a/forge-gui/res/cardsfolder/upcoming/conifer_wurm.txt b/forge-gui/res/cardsfolder/c/conifer_wurm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/conifer_wurm.txt rename to forge-gui/res/cardsfolder/c/conifer_wurm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cordial_vampire.txt b/forge-gui/res/cardsfolder/c/cordial_vampire.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cordial_vampire.txt rename to forge-gui/res/cardsfolder/c/cordial_vampire.txt diff --git a/forge-gui/res/cardsfolder/upcoming/crashing_footfalls.txt b/forge-gui/res/cardsfolder/c/crashing_footfalls.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/crashing_footfalls.txt rename to forge-gui/res/cardsfolder/c/crashing_footfalls.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cunning_evasion.txt b/forge-gui/res/cardsfolder/c/cunning_evasion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cunning_evasion.txt rename to forge-gui/res/cardsfolder/c/cunning_evasion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dead_of_winter.txt b/forge-gui/res/cardsfolder/d/dead_of_winter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dead_of_winter.txt rename to forge-gui/res/cardsfolder/d/dead_of_winter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/deep_forest_hermit.txt b/forge-gui/res/cardsfolder/d/deep_forest_hermit.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/deep_forest_hermit.txt rename to forge-gui/res/cardsfolder/d/deep_forest_hermit.txt diff --git a/forge-gui/res/cardsfolder/upcoming/defile.txt b/forge-gui/res/cardsfolder/d/defile.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/defile.txt rename to forge-gui/res/cardsfolder/d/defile.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dregscape_sliver.txt b/forge-gui/res/cardsfolder/d/dregscape_sliver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dregscape_sliver.txt rename to forge-gui/res/cardsfolder/d/dregscape_sliver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/echo_of_eons.txt b/forge-gui/res/cardsfolder/e/echo_of_eons.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/echo_of_eons.txt rename to forge-gui/res/cardsfolder/e/echo_of_eons.txt diff --git a/forge-gui/res/cardsfolder/upcoming/endling.txt b/forge-gui/res/cardsfolder/e/endling.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/endling.txt rename to forge-gui/res/cardsfolder/e/endling.txt diff --git a/forge-gui/res/cardsfolder/upcoming/enduring_sliver.txt b/forge-gui/res/cardsfolder/e/enduring_sliver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/enduring_sliver.txt rename to forge-gui/res/cardsfolder/e/enduring_sliver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ephemerate.txt b/forge-gui/res/cardsfolder/e/ephemerate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ephemerate.txt rename to forge-gui/res/cardsfolder/e/ephemerate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/etchings_of_the_chosen.txt b/forge-gui/res/cardsfolder/e/etchings_of_the_chosen.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/etchings_of_the_chosen.txt rename to forge-gui/res/cardsfolder/e/etchings_of_the_chosen.txt diff --git a/forge-gui/res/cardsfolder/upcoming/everdream.txt b/forge-gui/res/cardsfolder/e/everdream.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/everdream.txt rename to forge-gui/res/cardsfolder/e/everdream.txt diff --git a/forge-gui/res/cardsfolder/upcoming/excavating_anurid.txt b/forge-gui/res/cardsfolder/e/excavating_anurid.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/excavating_anurid.txt rename to forge-gui/res/cardsfolder/e/excavating_anurid.txt diff --git a/forge-gui/res/cardsfolder/upcoming/eyekite.txt b/forge-gui/res/cardsfolder/e/eyekite.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/eyekite.txt rename to forge-gui/res/cardsfolder/e/eyekite.txt diff --git a/forge-gui/res/cardsfolder/upcoming/face_of_divinity.txt b/forge-gui/res/cardsfolder/f/face_of_divinity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/face_of_divinity.txt rename to forge-gui/res/cardsfolder/f/face_of_divinity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/faerie_seer.txt b/forge-gui/res/cardsfolder/f/faerie_seer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/faerie_seer.txt rename to forge-gui/res/cardsfolder/f/faerie_seer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/fallen_shinobi.txt b/forge-gui/res/cardsfolder/f/fallen_shinobi.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fallen_shinobi.txt rename to forge-gui/res/cardsfolder/f/fallen_shinobi.txt diff --git a/forge-gui/res/cardsfolder/upcoming/farmstead_gleaner.txt b/forge-gui/res/cardsfolder/f/farmstead_gleaner.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/farmstead_gleaner.txt rename to forge-gui/res/cardsfolder/f/farmstead_gleaner.txt diff --git a/forge-gui/res/cardsfolder/upcoming/feaster_of_fools.txt b/forge-gui/res/cardsfolder/f/feaster_of_fools.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/feaster_of_fools.txt rename to forge-gui/res/cardsfolder/f/feaster_of_fools.txt diff --git a/forge-gui/res/cardsfolder/upcoming/fiery_islet.txt b/forge-gui/res/cardsfolder/f/fiery_islet.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fiery_islet.txt rename to forge-gui/res/cardsfolder/f/fiery_islet.txt diff --git a/forge-gui/res/cardsfolder/upcoming/first_slivers_chosen.txt b/forge-gui/res/cardsfolder/f/first_slivers_chosen.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/first_slivers_chosen.txt rename to forge-gui/res/cardsfolder/f/first_slivers_chosen.txt diff --git a/forge-gui/res/cardsfolder/upcoming/first_sphere_gargantua.txt b/forge-gui/res/cardsfolder/f/first_sphere_gargantua.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/first_sphere_gargantua.txt rename to forge-gui/res/cardsfolder/f/first_sphere_gargantua.txt diff --git a/forge-gui/res/cardsfolder/upcoming/fists_of_flame.txt b/forge-gui/res/cardsfolder/f/fists_of_flame.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fists_of_flame.txt rename to forge-gui/res/cardsfolder/f/fists_of_flame.txt diff --git a/forge-gui/res/cardsfolder/upcoming/force_of_despair.txt b/forge-gui/res/cardsfolder/f/force_of_despair.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/force_of_despair.txt rename to forge-gui/res/cardsfolder/f/force_of_despair.txt diff --git a/forge-gui/res/cardsfolder/upcoming/force_of_negation.txt b/forge-gui/res/cardsfolder/f/force_of_negation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/force_of_negation.txt rename to forge-gui/res/cardsfolder/f/force_of_negation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/force_of_rage.txt b/forge-gui/res/cardsfolder/f/force_of_rage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/force_of_rage.txt rename to forge-gui/res/cardsfolder/f/force_of_rage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/force_of_vigor.txt b/forge-gui/res/cardsfolder/f/force_of_vigor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/force_of_vigor.txt rename to forge-gui/res/cardsfolder/f/force_of_vigor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/force_of_virtue.txt b/forge-gui/res/cardsfolder/f/force_of_virtue.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/force_of_virtue.txt rename to forge-gui/res/cardsfolder/f/force_of_virtue.txt diff --git a/forge-gui/res/cardsfolder/upcoming/fountain_of_ichor.txt b/forge-gui/res/cardsfolder/f/fountain_of_ichor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fountain_of_ichor.txt rename to forge-gui/res/cardsfolder/f/fountain_of_ichor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/frostwalk_bastion.txt b/forge-gui/res/cardsfolder/f/frostwalk_bastion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/frostwalk_bastion.txt rename to forge-gui/res/cardsfolder/f/frostwalk_bastion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/frostwalla.txt b/forge-gui/res/cardsfolder/f/frostwalla.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/frostwalla.txt rename to forge-gui/res/cardsfolder/f/frostwalla.txt diff --git a/forge-gui/res/cardsfolder/upcoming/generous_gift.txt b/forge-gui/res/cardsfolder/g/generous_gift.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/generous_gift.txt rename to forge-gui/res/cardsfolder/g/generous_gift.txt diff --git a/forge-gui/res/cardsfolder/upcoming/geomancers_gambit.txt b/forge-gui/res/cardsfolder/g/geomancers_gambit.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/geomancers_gambit.txt rename to forge-gui/res/cardsfolder/g/geomancers_gambit.txt diff --git a/forge-gui/res/cardsfolder/upcoming/giver_of_runes.txt b/forge-gui/res/cardsfolder/g/giver_of_runes.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/giver_of_runes.txt rename to forge-gui/res/cardsfolder/g/giver_of_runes.txt diff --git a/forge-gui/res/cardsfolder/upcoming/glacial_revelation.txt b/forge-gui/res/cardsfolder/g/glacial_revelation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/glacial_revelation.txt rename to forge-gui/res/cardsfolder/g/glacial_revelation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gluttonous_slug.txt b/forge-gui/res/cardsfolder/g/gluttonous_slug.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gluttonous_slug.txt rename to forge-gui/res/cardsfolder/g/gluttonous_slug.txt diff --git a/forge-gui/res/cardsfolder/upcoming/goatnap.txt b/forge-gui/res/cardsfolder/g/goatnap.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/goatnap.txt rename to forge-gui/res/cardsfolder/g/goatnap.txt diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_champion.txt b/forge-gui/res/cardsfolder/g/goblin_champion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/goblin_champion.txt rename to forge-gui/res/cardsfolder/g/goblin_champion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_engineer.txt b/forge-gui/res/cardsfolder/g/goblin_engineer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/goblin_engineer.txt rename to forge-gui/res/cardsfolder/g/goblin_engineer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_oriflamme.txt b/forge-gui/res/cardsfolder/g/goblin_oriflamme.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/goblin_oriflamme.txt rename to forge-gui/res/cardsfolder/g/goblin_oriflamme.txt diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_war_party.txt b/forge-gui/res/cardsfolder/g/goblin_war_party.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/goblin_war_party.txt rename to forge-gui/res/cardsfolder/g/goblin_war_party.txt diff --git a/forge-gui/res/cardsfolder/upcoming/good_fortune_unicorn.txt b/forge-gui/res/cardsfolder/g/good_fortune_unicorn.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/good_fortune_unicorn.txt rename to forge-gui/res/cardsfolder/g/good_fortune_unicorn.txt diff --git a/forge-gui/res/cardsfolder/upcoming/graveshifter.txt b/forge-gui/res/cardsfolder/g/graveshifter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/graveshifter.txt rename to forge-gui/res/cardsfolder/g/graveshifter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hall_of_heliods_generosity.txt b/forge-gui/res/cardsfolder/h/hall_of_heliods_generosity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hall_of_heliods_generosity.txt rename to forge-gui/res/cardsfolder/h/hall_of_heliods_generosity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/headless_specter.txt b/forge-gui/res/cardsfolder/h/headless_specter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/headless_specter.txt rename to forge-gui/res/cardsfolder/h/headless_specter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hexdrinker.txt b/forge-gui/res/cardsfolder/h/hexdrinker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hexdrinker.txt rename to forge-gui/res/cardsfolder/h/hexdrinker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hogaak_arisen_necropolis.txt b/forge-gui/res/cardsfolder/h/hogaak_arisen_necropolis.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hogaak_arisen_necropolis.txt rename to forge-gui/res/cardsfolder/h/hogaak_arisen_necropolis.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hollowhead_sliver.txt b/forge-gui/res/cardsfolder/h/hollowhead_sliver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hollowhead_sliver.txt rename to forge-gui/res/cardsfolder/h/hollowhead_sliver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ice_fang_coatl.txt b/forge-gui/res/cardsfolder/i/ice_fang_coatl.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ice_fang_coatl.txt rename to forge-gui/res/cardsfolder/i/ice_fang_coatl.txt diff --git a/forge-gui/res/cardsfolder/upcoming/iceberg_cancrix.txt b/forge-gui/res/cardsfolder/i/iceberg_cancrix.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/iceberg_cancrix.txt rename to forge-gui/res/cardsfolder/i/iceberg_cancrix.txt diff --git a/forge-gui/res/cardsfolder/upcoming/icehide_golem.txt b/forge-gui/res/cardsfolder/i/icehide_golem.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/icehide_golem.txt rename to forge-gui/res/cardsfolder/i/icehide_golem.txt diff --git a/forge-gui/res/cardsfolder/upcoming/igneous_elemental.txt b/forge-gui/res/cardsfolder/i/igneous_elemental.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/igneous_elemental.txt rename to forge-gui/res/cardsfolder/i/igneous_elemental.txt diff --git a/forge-gui/res/cardsfolder/upcoming/impostor_of_the_sixth_pride.txt b/forge-gui/res/cardsfolder/i/impostor_of_the_sixth_pride.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/impostor_of_the_sixth_pride.txt rename to forge-gui/res/cardsfolder/i/impostor_of_the_sixth_pride.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ingenious_infiltrator.txt b/forge-gui/res/cardsfolder/i/ingenious_infiltrator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ingenious_infiltrator.txt rename to forge-gui/res/cardsfolder/i/ingenious_infiltrator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/irregular_cohort.txt b/forge-gui/res/cardsfolder/i/irregular_cohort.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/irregular_cohort.txt rename to forge-gui/res/cardsfolder/i/irregular_cohort.txt diff --git a/forge-gui/res/cardsfolder/upcoming/kayas_guile.txt b/forge-gui/res/cardsfolder/k/kayas_guile.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/kayas_guile.txt rename to forge-gui/res/cardsfolder/k/kayas_guile.txt diff --git a/forge-gui/res/cardsfolder/upcoming/king_of_the_pride.txt b/forge-gui/res/cardsfolder/k/king_of_the_pride.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/king_of_the_pride.txt rename to forge-gui/res/cardsfolder/k/king_of_the_pride.txt diff --git a/forge-gui/res/cardsfolder/upcoming/knight_of_old_benalia.txt b/forge-gui/res/cardsfolder/k/knight_of_old_benalia.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/knight_of_old_benalia.txt rename to forge-gui/res/cardsfolder/k/knight_of_old_benalia.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lancer_sliver.txt b/forge-gui/res/cardsfolder/l/lancer_sliver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lancer_sliver.txt rename to forge-gui/res/cardsfolder/l/lancer_sliver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lavabelly_sliver.txt b/forge-gui/res/cardsfolder/l/lavabelly_sliver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lavabelly_sliver.txt rename to forge-gui/res/cardsfolder/l/lavabelly_sliver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lesser_masticore.txt b/forge-gui/res/cardsfolder/l/lesser_masticore.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lesser_masticore.txt rename to forge-gui/res/cardsfolder/l/lesser_masticore.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lightning_skelemental.txt b/forge-gui/res/cardsfolder/l/lightning_skelemental.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lightning_skelemental.txt rename to forge-gui/res/cardsfolder/l/lightning_skelemental.txt diff --git a/forge-gui/res/cardsfolder/upcoming/llanowar_tribe.txt b/forge-gui/res/cardsfolder/l/llanowar_tribe.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/llanowar_tribe.txt rename to forge-gui/res/cardsfolder/l/llanowar_tribe.txt diff --git a/forge-gui/res/cardsfolder/upcoming/magmatic_sinkhole.txt b/forge-gui/res/cardsfolder/m/magmatic_sinkhole.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/magmatic_sinkhole.txt rename to forge-gui/res/cardsfolder/m/magmatic_sinkhole.txt diff --git a/forge-gui/res/cardsfolder/upcoming/marit_lages_slumber.txt b/forge-gui/res/cardsfolder/m/marit_lages_slumber.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/marit_lages_slumber.txt rename to forge-gui/res/cardsfolder/m/marit_lages_slumber.txt diff --git a/forge-gui/res/cardsfolder/upcoming/martyrs_soul.txt b/forge-gui/res/cardsfolder/m/martyrs_soul.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/martyrs_soul.txt rename to forge-gui/res/cardsfolder/m/martyrs_soul.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mind_rake.txt b/forge-gui/res/cardsfolder/m/mind_rake.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mind_rake.txt rename to forge-gui/res/cardsfolder/m/mind_rake.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mirrodin_besieged.txt b/forge-gui/res/cardsfolder/m/mirrodin_besieged.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mirrodin_besieged.txt rename to forge-gui/res/cardsfolder/m/mirrodin_besieged.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mist_syndicate_naga.txt b/forge-gui/res/cardsfolder/m/mist_syndicate_naga.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mist_syndicate_naga.txt rename to forge-gui/res/cardsfolder/m/mist_syndicate_naga.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mob.txt b/forge-gui/res/cardsfolder/m/mob.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mob.txt rename to forge-gui/res/cardsfolder/m/mob.txt diff --git a/forge-gui/res/cardsfolder/upcoming/moonblade_shinobi.txt b/forge-gui/res/cardsfolder/m/moonblade_shinobi.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/moonblade_shinobi.txt rename to forge-gui/res/cardsfolder/m/moonblade_shinobi.txt diff --git a/forge-gui/res/cardsfolder/upcoming/morophon_the_boundless.txt b/forge-gui/res/cardsfolder/m/morophon_the_boundless.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/morophon_the_boundless.txt rename to forge-gui/res/cardsfolder/m/morophon_the_boundless.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mother_bear.txt b/forge-gui/res/cardsfolder/m/mother_bear.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mother_bear.txt rename to forge-gui/res/cardsfolder/m/mother_bear.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mox_tantalite.txt b/forge-gui/res/cardsfolder/m/mox_tantalite.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mox_tantalite.txt rename to forge-gui/res/cardsfolder/m/mox_tantalite.txt diff --git a/forge-gui/res/cardsfolder/upcoming/munitions_expert.txt b/forge-gui/res/cardsfolder/m/munitions_expert.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/munitions_expert.txt rename to forge-gui/res/cardsfolder/m/munitions_expert.txt diff --git a/forge-gui/res/cardsfolder/upcoming/murasa_behemoth.txt b/forge-gui/res/cardsfolder/m/murasa_behemoth.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/murasa_behemoth.txt rename to forge-gui/res/cardsfolder/m/murasa_behemoth.txt diff --git a/forge-gui/res/cardsfolder/upcoming/natures_chant.txt b/forge-gui/res/cardsfolder/n/natures_chant.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/natures_chant.txt rename to forge-gui/res/cardsfolder/n/natures_chant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ninja_of_the_new_moon.txt b/forge-gui/res/cardsfolder/n/ninja_of_the_new_moon.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ninja_of_the_new_moon.txt rename to forge-gui/res/cardsfolder/n/ninja_of_the_new_moon.txt diff --git a/forge-gui/res/cardsfolder/upcoming/nurturing_peatland.txt b/forge-gui/res/cardsfolder/n/nurturing_peatland.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/nurturing_peatland.txt rename to forge-gui/res/cardsfolder/n/nurturing_peatland.txt diff --git a/forge-gui/res/cardsfolder/upcoming/on_thin_ice.txt b/forge-gui/res/cardsfolder/o/on_thin_ice.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/on_thin_ice.txt rename to forge-gui/res/cardsfolder/o/on_thin_ice.txt diff --git a/forge-gui/res/cardsfolder/upcoming/oneirophage.txt b/forge-gui/res/cardsfolder/o/oneirophage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/oneirophage.txt rename to forge-gui/res/cardsfolder/o/oneirophage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/orcish_hellraiser.txt b/forge-gui/res/cardsfolder/o/orcish_hellraiser.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/orcish_hellraiser.txt rename to forge-gui/res/cardsfolder/o/orcish_hellraiser.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ore_scale_guardian.txt b/forge-gui/res/cardsfolder/o/ore_scale_guardian.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ore_scale_guardian.txt rename to forge-gui/res/cardsfolder/o/ore_scale_guardian.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pashalik_mons.txt b/forge-gui/res/cardsfolder/p/pashalik_mons.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pashalik_mons.txt rename to forge-gui/res/cardsfolder/p/pashalik_mons.txt diff --git a/forge-gui/res/cardsfolder/upcoming/phantasmal_form.txt b/forge-gui/res/cardsfolder/p/phantasmal_form.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/phantasmal_form.txt rename to forge-gui/res/cardsfolder/p/phantasmal_form.txt diff --git a/forge-gui/res/cardsfolder/upcoming/phantom_ninja.txt b/forge-gui/res/cardsfolder/p/phantom_ninja.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/phantom_ninja.txt rename to forge-gui/res/cardsfolder/p/phantom_ninja.txt diff --git a/forge-gui/res/cardsfolder/upcoming/plague_engineer.txt b/forge-gui/res/cardsfolder/p/plague_engineer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/plague_engineer.txt rename to forge-gui/res/cardsfolder/p/plague_engineer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/planebound_accomplice.txt b/forge-gui/res/cardsfolder/p/planebound_accomplice.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/planebound_accomplice.txt rename to forge-gui/res/cardsfolder/p/planebound_accomplice.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pondering_mage.txt b/forge-gui/res/cardsfolder/p/pondering_mage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pondering_mage.txt rename to forge-gui/res/cardsfolder/p/pondering_mage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/prismatic_vista.txt b/forge-gui/res/cardsfolder/p/prismatic_vista.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/prismatic_vista.txt rename to forge-gui/res/cardsfolder/p/prismatic_vista.txt diff --git a/forge-gui/res/cardsfolder/upcoming/putrid_goblin.txt b/forge-gui/res/cardsfolder/p/putrid_goblin.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/putrid_goblin.txt rename to forge-gui/res/cardsfolder/p/putrid_goblin.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pyrophobia.txt b/forge-gui/res/cardsfolder/p/pyrophobia.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pyrophobia.txt rename to forge-gui/res/cardsfolder/p/pyrophobia.txt diff --git a/forge-gui/res/cardsfolder/upcoming/quakefoot_cyclops.txt b/forge-gui/res/cardsfolder/q/quakefoot_cyclops.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/quakefoot_cyclops.txt rename to forge-gui/res/cardsfolder/q/quakefoot_cyclops.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rain_of_revelation.txt b/forge-gui/res/cardsfolder/r/rain_of_revelation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rain_of_revelation.txt rename to forge-gui/res/cardsfolder/r/rain_of_revelation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ranger_captain_of_eos.txt b/forge-gui/res/cardsfolder/r/ranger_captain_of_eos.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ranger_captain_of_eos.txt rename to forge-gui/res/cardsfolder/r/ranger_captain_of_eos.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rank_officer.txt b/forge-gui/res/cardsfolder/r/rank_officer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rank_officer.txt rename to forge-gui/res/cardsfolder/r/rank_officer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ransack_the_lab.txt b/forge-gui/res/cardsfolder/r/ransack_the_lab.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ransack_the_lab.txt rename to forge-gui/res/cardsfolder/r/ransack_the_lab.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ravenous_giant.txt b/forge-gui/res/cardsfolder/r/ravenous_giant.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ravenous_giant.txt rename to forge-gui/res/cardsfolder/r/ravenous_giant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/reap_the_past.txt b/forge-gui/res/cardsfolder/r/reap_the_past.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/reap_the_past.txt rename to forge-gui/res/cardsfolder/r/reap_the_past.txt diff --git a/forge-gui/res/cardsfolder/upcoming/recruit_the_worthy.txt b/forge-gui/res/cardsfolder/r/recruit_the_worthy.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/recruit_the_worthy.txt rename to forge-gui/res/cardsfolder/r/recruit_the_worthy.txt diff --git a/forge-gui/res/cardsfolder/upcoming/reprobation.txt b/forge-gui/res/cardsfolder/r/reprobation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/reprobation.txt rename to forge-gui/res/cardsfolder/r/reprobation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/return_from_extinction.txt b/forge-gui/res/cardsfolder/r/return_from_extinction.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/return_from_extinction.txt rename to forge-gui/res/cardsfolder/r/return_from_extinction.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rhox_veteran.txt b/forge-gui/res/cardsfolder/r/rhox_veteran.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rhox_veteran.txt rename to forge-gui/res/cardsfolder/r/rhox_veteran.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rime_tender.txt b/forge-gui/res/cardsfolder/r/rime_tender.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rime_tender.txt rename to forge-gui/res/cardsfolder/r/rime_tender.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rotwidow_pack.txt b/forge-gui/res/cardsfolder/r/rotwidow_pack.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rotwidow_pack.txt rename to forge-gui/res/cardsfolder/r/rotwidow_pack.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ruination_rioter.txt b/forge-gui/res/cardsfolder/r/ruination_rioter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ruination_rioter.txt rename to forge-gui/res/cardsfolder/r/ruination_rioter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/saddled_rimestag.txt b/forge-gui/res/cardsfolder/s/saddled_rimestag.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/saddled_rimestag.txt rename to forge-gui/res/cardsfolder/s/saddled_rimestag.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sadistic_obsession.txt b/forge-gui/res/cardsfolder/s/sadistic_obsession.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sadistic_obsession.txt rename to forge-gui/res/cardsfolder/s/sadistic_obsession.txt diff --git a/forge-gui/res/cardsfolder/upcoming/savage_swipe.txt b/forge-gui/res/cardsfolder/s/savage_swipe.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/savage_swipe.txt rename to forge-gui/res/cardsfolder/s/savage_swipe.txt diff --git a/forge-gui/res/cardsfolder/upcoming/scale_up.txt b/forge-gui/res/cardsfolder/s/scale_up.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scale_up.txt rename to forge-gui/res/cardsfolder/s/scale_up.txt diff --git a/forge-gui/res/cardsfolder/upcoming/scour_all_possibilities.txt b/forge-gui/res/cardsfolder/s/scour_all_possibilities.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scour_all_possibilities.txt rename to forge-gui/res/cardsfolder/s/scour_all_possibilities.txt diff --git a/forge-gui/res/cardsfolder/upcoming/scrapyard_recombiner.txt b/forge-gui/res/cardsfolder/s/scrapyard_recombiner.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scrapyard_recombiner.txt rename to forge-gui/res/cardsfolder/s/scrapyard_recombiner.txt diff --git a/forge-gui/res/cardsfolder/upcoming/scuttling_sliver.txt b/forge-gui/res/cardsfolder/s/scuttling_sliver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scuttling_sliver.txt rename to forge-gui/res/cardsfolder/s/scuttling_sliver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/seasoned_pyromancer.txt b/forge-gui/res/cardsfolder/s/seasoned_pyromancer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/seasoned_pyromancer.txt rename to forge-gui/res/cardsfolder/s/seasoned_pyromancer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/segovian_angel.txt b/forge-gui/res/cardsfolder/s/segovian_angel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/segovian_angel.txt rename to forge-gui/res/cardsfolder/s/segovian_angel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/serra_the_benevolent.txt b/forge-gui/res/cardsfolder/s/serra_the_benevolent.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/serra_the_benevolent.txt rename to forge-gui/res/cardsfolder/s/serra_the_benevolent.txt diff --git a/forge-gui/res/cardsfolder/upcoming/settle_beyond_reality.txt b/forge-gui/res/cardsfolder/s/settle_beyond_reality.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/settle_beyond_reality.txt rename to forge-gui/res/cardsfolder/s/settle_beyond_reality.txt diff --git a/forge-gui/res/cardsfolder/upcoming/shatter_assumptions.txt b/forge-gui/res/cardsfolder/s/shatter_assumptions.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/shatter_assumptions.txt rename to forge-gui/res/cardsfolder/s/shatter_assumptions.txt diff --git a/forge-gui/res/cardsfolder/upcoming/shenanigans.txt b/forge-gui/res/cardsfolder/s/shenanigans.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/shenanigans.txt rename to forge-gui/res/cardsfolder/s/shenanigans.txt diff --git a/forge-gui/res/cardsfolder/upcoming/silent_clearing.txt b/forge-gui/res/cardsfolder/s/silent_clearing.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/silent_clearing.txt rename to forge-gui/res/cardsfolder/s/silent_clearing.txt diff --git a/forge-gui/res/cardsfolder/upcoming/silumgar_scavenger.txt b/forge-gui/res/cardsfolder/s/silumgar_scavenger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/silumgar_scavenger.txt rename to forge-gui/res/cardsfolder/s/silumgar_scavenger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sisay_weatherlight_captain.txt b/forge-gui/res/cardsfolder/s/sisay_weatherlight_captain.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sisay_weatherlight_captain.txt rename to forge-gui/res/cardsfolder/s/sisay_weatherlight_captain.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sling_gang_lieutenant.txt b/forge-gui/res/cardsfolder/s/sling_gang_lieutenant.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sling_gang_lieutenant.txt rename to forge-gui/res/cardsfolder/s/sling_gang_lieutenant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/smiting_helix.txt b/forge-gui/res/cardsfolder/s/smiting_helix.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/smiting_helix.txt rename to forge-gui/res/cardsfolder/s/smiting_helix.txt diff --git a/forge-gui/res/cardsfolder/upcoming/smoke_shroud.txt b/forge-gui/res/cardsfolder/s/smoke_shroud.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/smoke_shroud.txt rename to forge-gui/res/cardsfolder/s/smoke_shroud.txt diff --git a/forge-gui/res/cardsfolder/upcoming/soul_strike_technique.txt b/forge-gui/res/cardsfolder/s/soul_strike_technique.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/soul_strike_technique.txt rename to forge-gui/res/cardsfolder/s/soul_strike_technique.txt diff --git a/forge-gui/res/cardsfolder/upcoming/soulherder.txt b/forge-gui/res/cardsfolder/s/soulherder.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/soulherder.txt rename to forge-gui/res/cardsfolder/s/soulherder.txt diff --git a/forge-gui/res/cardsfolder/upcoming/spell_snuff.txt b/forge-gui/res/cardsfolder/s/spell_snuff.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/spell_snuff.txt rename to forge-gui/res/cardsfolder/s/spell_snuff.txt diff --git a/forge-gui/res/cardsfolder/upcoming/spinehorn_minotaur.txt b/forge-gui/res/cardsfolder/s/spinehorn_minotaur.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/spinehorn_minotaur.txt rename to forge-gui/res/cardsfolder/s/spinehorn_minotaur.txt diff --git a/forge-gui/res/cardsfolder/upcoming/spiteful_sliver.txt b/forge-gui/res/cardsfolder/s/spiteful_sliver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/spiteful_sliver.txt rename to forge-gui/res/cardsfolder/s/spiteful_sliver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/splicers_skill.txt b/forge-gui/res/cardsfolder/s/splicers_skill.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/splicers_skill.txt rename to forge-gui/res/cardsfolder/s/splicers_skill.txt diff --git a/forge-gui/res/cardsfolder/upcoming/springbloom_druid.txt b/forge-gui/res/cardsfolder/s/springbloom_druid.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/springbloom_druid.txt rename to forge-gui/res/cardsfolder/s/springbloom_druid.txt diff --git a/forge-gui/res/cardsfolder/upcoming/stirring_address.txt b/forge-gui/res/cardsfolder/s/stirring_address.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/stirring_address.txt rename to forge-gui/res/cardsfolder/s/stirring_address.txt diff --git a/forge-gui/res/cardsfolder/upcoming/stream_of_thought.txt b/forge-gui/res/cardsfolder/s/stream_of_thought.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/stream_of_thought.txt rename to forge-gui/res/cardsfolder/s/stream_of_thought.txt diff --git a/forge-gui/res/cardsfolder/upcoming/string_of_disappearances.txt b/forge-gui/res/cardsfolder/s/string_of_disappearances.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/string_of_disappearances.txt rename to forge-gui/res/cardsfolder/s/string_of_disappearances.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sunbaked_canyon.txt b/forge-gui/res/cardsfolder/s/sunbaked_canyon.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sunbaked_canyon.txt rename to forge-gui/res/cardsfolder/s/sunbaked_canyon.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sword_of_sinew_and_steel.txt b/forge-gui/res/cardsfolder/s/sword_of_sinew_and_steel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sword_of_sinew_and_steel.txt rename to forge-gui/res/cardsfolder/s/sword_of_sinew_and_steel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sword_of_truth_and_justice.txt b/forge-gui/res/cardsfolder/s/sword_of_truth_and_justice.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sword_of_truth_and_justice.txt rename to forge-gui/res/cardsfolder/s/sword_of_truth_and_justice.txt diff --git a/forge-gui/res/cardsfolder/upcoming/talisman_of_conviction.txt b/forge-gui/res/cardsfolder/t/talisman_of_conviction.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/talisman_of_conviction.txt rename to forge-gui/res/cardsfolder/t/talisman_of_conviction.txt diff --git a/forge-gui/res/cardsfolder/upcoming/talisman_of_creativity.txt b/forge-gui/res/cardsfolder/t/talisman_of_creativity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/talisman_of_creativity.txt rename to forge-gui/res/cardsfolder/t/talisman_of_creativity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/talisman_of_curiosity.txt b/forge-gui/res/cardsfolder/t/talisman_of_curiosity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/talisman_of_curiosity.txt rename to forge-gui/res/cardsfolder/t/talisman_of_curiosity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/talisman_of_hierarchy.txt b/forge-gui/res/cardsfolder/t/talisman_of_hierarchy.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/talisman_of_hierarchy.txt rename to forge-gui/res/cardsfolder/t/talisman_of_hierarchy.txt diff --git a/forge-gui/res/cardsfolder/upcoming/talisman_of_resilience.txt b/forge-gui/res/cardsfolder/t/talisman_of_resilience.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/talisman_of_resilience.txt rename to forge-gui/res/cardsfolder/t/talisman_of_resilience.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tectonic_reformation.txt b/forge-gui/res/cardsfolder/t/tectonic_reformation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tectonic_reformation.txt rename to forge-gui/res/cardsfolder/t/tectonic_reformation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tempered_sliver.txt b/forge-gui/res/cardsfolder/t/tempered_sliver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tempered_sliver.txt rename to forge-gui/res/cardsfolder/t/tempered_sliver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/the_first_sliver.txt b/forge-gui/res/cardsfolder/t/the_first_sliver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/the_first_sliver.txt rename to forge-gui/res/cardsfolder/t/the_first_sliver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/thornado.txt b/forge-gui/res/cardsfolder/t/thornado.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thornado.txt rename to forge-gui/res/cardsfolder/t/thornado.txt diff --git a/forge-gui/res/cardsfolder/upcoming/throatseeker.txt b/forge-gui/res/cardsfolder/t/throatseeker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/throatseeker.txt rename to forge-gui/res/cardsfolder/t/throatseeker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/throes_of_chaos.txt b/forge-gui/res/cardsfolder/t/throes_of_chaos.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/throes_of_chaos.txt rename to forge-gui/res/cardsfolder/t/throes_of_chaos.txt diff --git a/forge-gui/res/cardsfolder/upcoming/thundering_djinn.txt b/forge-gui/res/cardsfolder/t/thundering_djinn.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thundering_djinn.txt rename to forge-gui/res/cardsfolder/t/thundering_djinn.txt diff --git a/forge-gui/res/cardsfolder/upcoming/treefolk_umbra.txt b/forge-gui/res/cardsfolder/t/treefolk_umbra.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/treefolk_umbra.txt rename to forge-gui/res/cardsfolder/t/treefolk_umbra.txt diff --git a/forge-gui/res/cardsfolder/upcoming/treetop_ambusher.txt b/forge-gui/res/cardsfolder/t/treetop_ambusher.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/treetop_ambusher.txt rename to forge-gui/res/cardsfolder/t/treetop_ambusher.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tribute_mage.txt b/forge-gui/res/cardsfolder/t/tribute_mage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tribute_mage.txt rename to forge-gui/res/cardsfolder/t/tribute_mage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/trumpeting_herd.txt b/forge-gui/res/cardsfolder/t/trumpeting_herd.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/trumpeting_herd.txt rename to forge-gui/res/cardsfolder/t/trumpeting_herd.txt diff --git a/forge-gui/res/cardsfolder/upcoming/trustworthy_scout.txt b/forge-gui/res/cardsfolder/t/trustworthy_scout.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/trustworthy_scout.txt rename to forge-gui/res/cardsfolder/t/trustworthy_scout.txt diff --git a/forge-gui/res/cardsfolder/upcoming/twin_silk_spider.txt b/forge-gui/res/cardsfolder/t/twin_silk_spider.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/twin_silk_spider.txt rename to forge-gui/res/cardsfolder/t/twin_silk_spider.txt diff --git a/forge-gui/res/cardsfolder/upcoming/twisted_reflection.txt b/forge-gui/res/cardsfolder/t/twisted_reflection.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/twisted_reflection.txt rename to forge-gui/res/cardsfolder/t/twisted_reflection.txt diff --git a/forge-gui/res/cardsfolder/upcoming/umezawas_charm.txt b/forge-gui/res/cardsfolder/u/umezawas_charm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/umezawas_charm.txt rename to forge-gui/res/cardsfolder/u/umezawas_charm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/unbound_flourishing.txt b/forge-gui/res/cardsfolder/u/unbound_flourishing.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/unbound_flourishing.txt rename to forge-gui/res/cardsfolder/u/unbound_flourishing.txt diff --git a/forge-gui/res/cardsfolder/upcoming/undead_augur.txt b/forge-gui/res/cardsfolder/u/undead_augur.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/undead_augur.txt rename to forge-gui/res/cardsfolder/u/undead_augur.txt diff --git a/forge-gui/res/cardsfolder/upcoming/universal_automaton.txt b/forge-gui/res/cardsfolder/u/universal_automaton.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/universal_automaton.txt rename to forge-gui/res/cardsfolder/u/universal_automaton.txt diff --git a/forge-gui/res/cardsfolder/upcoming/unsettled_mariner.txt b/forge-gui/res/cardsfolder/u/unsettled_mariner.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/unsettled_mariner.txt rename to forge-gui/res/cardsfolder/u/unsettled_mariner.txt diff --git a/forge-gui/res/cardsfolder/upcoming/urza_lord_high_artificer.txt b/forge-gui/res/cardsfolder/u/urza_lord_high_artificer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/urza_lord_high_artificer.txt rename to forge-gui/res/cardsfolder/u/urza_lord_high_artificer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/valiant_changeling.txt b/forge-gui/res/cardsfolder/v/valiant_changeling.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/valiant_changeling.txt rename to forge-gui/res/cardsfolder/v/valiant_changeling.txt diff --git a/forge-gui/res/cardsfolder/upcoming/vengeful_devil.txt b/forge-gui/res/cardsfolder/v/vengeful_devil.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/vengeful_devil.txt rename to forge-gui/res/cardsfolder/v/vengeful_devil.txt diff --git a/forge-gui/res/cardsfolder/upcoming/venomous_changeling.txt b/forge-gui/res/cardsfolder/v/venomous_changeling.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/venomous_changeling.txt rename to forge-gui/res/cardsfolder/v/venomous_changeling.txt diff --git a/forge-gui/res/cardsfolder/upcoming/vesperlark.txt b/forge-gui/res/cardsfolder/v/vesperlark.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/vesperlark.txt rename to forge-gui/res/cardsfolder/v/vesperlark.txt diff --git a/forge-gui/res/cardsfolder/upcoming/viashino_sandsprinter.txt b/forge-gui/res/cardsfolder/v/viashino_sandsprinter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/viashino_sandsprinter.txt rename to forge-gui/res/cardsfolder/v/viashino_sandsprinter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/volatile_claws.txt b/forge-gui/res/cardsfolder/v/volatile_claws.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/volatile_claws.txt rename to forge-gui/res/cardsfolder/v/volatile_claws.txt diff --git a/forge-gui/res/cardsfolder/upcoming/wall_of_one_thousand_cuts.txt b/forge-gui/res/cardsfolder/w/wall_of_one_thousand_cuts.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/wall_of_one_thousand_cuts.txt rename to forge-gui/res/cardsfolder/w/wall_of_one_thousand_cuts.txt diff --git a/forge-gui/res/cardsfolder/upcoming/warteye_witch.txt b/forge-gui/res/cardsfolder/w/warteye_witch.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/warteye_witch.txt rename to forge-gui/res/cardsfolder/w/warteye_witch.txt diff --git a/forge-gui/res/cardsfolder/upcoming/watcher_for_tomorrow.txt b/forge-gui/res/cardsfolder/w/watcher_for_tomorrow.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/watcher_for_tomorrow.txt rename to forge-gui/res/cardsfolder/w/watcher_for_tomorrow.txt diff --git a/forge-gui/res/cardsfolder/upcoming/waterlogged_grove.txt b/forge-gui/res/cardsfolder/w/waterlogged_grove.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/waterlogged_grove.txt rename to forge-gui/res/cardsfolder/w/waterlogged_grove.txt diff --git a/forge-gui/res/cardsfolder/upcoming/weather_the_storm.txt b/forge-gui/res/cardsfolder/w/weather_the_storm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/weather_the_storm.txt rename to forge-gui/res/cardsfolder/w/weather_the_storm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/webweaver_changeling.txt b/forge-gui/res/cardsfolder/w/webweaver_changeling.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/webweaver_changeling.txt rename to forge-gui/res/cardsfolder/w/webweaver_changeling.txt diff --git a/forge-gui/res/cardsfolder/upcoming/windcaller_aven.txt b/forge-gui/res/cardsfolder/w/windcaller_aven.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/windcaller_aven.txt rename to forge-gui/res/cardsfolder/w/windcaller_aven.txt diff --git a/forge-gui/res/cardsfolder/upcoming/winding_way.txt b/forge-gui/res/cardsfolder/w/winding_way.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/winding_way.txt rename to forge-gui/res/cardsfolder/w/winding_way.txt diff --git a/forge-gui/res/cardsfolder/upcoming/winds_of_abandon.txt b/forge-gui/res/cardsfolder/w/winds_of_abandon.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/winds_of_abandon.txt rename to forge-gui/res/cardsfolder/w/winds_of_abandon.txt diff --git a/forge-gui/res/cardsfolder/upcoming/winters_rest.txt b/forge-gui/res/cardsfolder/w/winters_rest.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/winters_rest.txt rename to forge-gui/res/cardsfolder/w/winters_rest.txt diff --git a/forge-gui/res/cardsfolder/upcoming/wrenn_and_six.txt b/forge-gui/res/cardsfolder/w/wrenn_and_six.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/wrenn_and_six.txt rename to forge-gui/res/cardsfolder/w/wrenn_and_six.txt diff --git a/forge-gui/res/cardsfolder/upcoming/yawgmoth_thran_physician.txt b/forge-gui/res/cardsfolder/y/yawgmoth_thran_physician.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/yawgmoth_thran_physician.txt rename to forge-gui/res/cardsfolder/y/yawgmoth_thran_physician.txt diff --git a/forge-gui/res/cardsfolder/upcoming/zhalfirin_decoy.txt b/forge-gui/res/cardsfolder/z/zhalfirin_decoy.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/zhalfirin_decoy.txt rename to forge-gui/res/cardsfolder/z/zhalfirin_decoy.txt From a9275b11849846395aa0b7303f969c07800c63c0 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 14 Jun 2019 07:18:30 +0300 Subject: [PATCH 16/39] - Fix the Domain achievement not working correctly with snow-covered basic lands. --- .../main/java/forge/achievement/Domain.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/forge-gui/src/main/java/forge/achievement/Domain.java b/forge-gui/src/main/java/forge/achievement/Domain.java index 2aa7c8da680..93b6a397889 100644 --- a/forge-gui/src/main/java/forge/achievement/Domain.java +++ b/forge-gui/src/main/java/forge/achievement/Domain.java @@ -1,19 +1,35 @@ package forge.achievement; -import java.util.HashSet; -import java.util.Set; - import forge.game.Game; import forge.game.GameType; import forge.game.card.Card; import forge.game.player.Player; import forge.game.zone.ZoneType; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + public class Domain extends ProgressiveAchievement { public Domain() { super("Domain", "Domain", "Win a game with one of each basic land on the battlefield", "It's nice being able to cast anything you want."); } + private HashMap basicLandMap = new HashMap() { + { + put("Plains", "Plains"); + put("Snow-Covered Plains", "Plains"); + put("Island", "Island"); + put("Snow-Covered Island", "Island"); + put("Forest", "Forest"); + put("Snow-Covered Forest", "Forest"); + put("Mountain", "Mountain"); + put("Snow-Covered Mountain", "Mountain"); + put("Swamp", "Swamp"); + put("Snow-Covered Swamp", "Swamp"); + } + }; + @Override protected boolean eval(Player player, Game game) { if (game.getRules().hasAppliedVariant(GameType.MomirBasic) || game.getRules().hasAppliedVariant(GameType.MoJhoSto)) { @@ -23,8 +39,9 @@ public class Domain extends ProgressiveAchievement { if (player.getOutcome().hasWon()) { Set basicLands = new HashSet(); for (Card c : player.getCardsIn(ZoneType.Battlefield)) { - if (c.isBasicLand()) { - basicLands.add(c.getName()); + String name = c.getName(); + if (c.isBasicLand() && basicLandMap.containsKey(name)) { + basicLands.add(basicLandMap.get(name)); } } return basicLands.size() == 5; From 296a9c32d4dc2bba1302dfd96abf4aec8c801770 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 14 Jun 2019 09:04:46 +0300 Subject: [PATCH 17/39] - Fix token definition in Ravnica Allegiance --- forge-gui/res/editions/Ravnica Allegiance.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Ravnica Allegiance.txt b/forge-gui/res/editions/Ravnica Allegiance.txt index 9ecee43ba81..bb88b427d96 100644 --- a/forge-gui/res/editions/Ravnica Allegiance.txt +++ b/forge-gui/res/editions/Ravnica Allegiance.txt @@ -284,7 +284,7 @@ Booster=10 Common:!fromSheet("RNA Secret Cards"), 3 Uncommon:!fromSheet("RNA Sec 273 M The Haunt of Hightower [tokens] -rg_4_4_beast +rg_4_4_beast_trample g_3_3_centaur g_3_3_frog_lizard r_1_1_goblin From 192f205c0d83655603f95247b995e183597999a5 Mon Sep 17 00:00:00 2001 From: swordshine Date: Fri, 14 Jun 2019 15:24:39 +0800 Subject: [PATCH 18/39] Update some scripts --- forge-gui/res/cardsfolder/d/dead_of_winter.txt | 2 +- forge-gui/res/cardsfolder/g/goatnap.txt | 2 +- forge-gui/res/cardsfolder/r/rakshasa_vizier.txt | 2 +- forge-gui/res/cardsfolder/r/rowan_kenrith.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/d/dead_of_winter.txt b/forge-gui/res/cardsfolder/d/dead_of_winter.txt index f01e6a9a775..762ab799287 100644 --- a/forge-gui/res/cardsfolder/d/dead_of_winter.txt +++ b/forge-gui/res/cardsfolder/d/dead_of_winter.txt @@ -1,7 +1,7 @@ Name:Dead of Winter ManaCost:2 B Types:Sorcery -A:SP$ PumpAll | Cost$ 2 B | ValidCards$ Creature.Snow | NumAtt$ -X | NumDef$ -X | References$ X | SpellDescription$ All nonsnow creatures get -X/-X until end of turn, where X is the number of snow permanents you control. +A:SP$ PumpAll | Cost$ 2 B | ValidCards$ Creature.nonSnow | NumAtt$ -X | NumDef$ -X | References$ X | SpellDescription$ All nonsnow creatures get -X/-X until end of turn, where X is the number of snow permanents you control. SVar:X:Count$Valid Permanent.Snow+YouCtrl AI:RemoveDeck:Random DeckNeeds:Type$Snow diff --git a/forge-gui/res/cardsfolder/g/goatnap.txt b/forge-gui/res/cardsfolder/g/goatnap.txt index 0c21954562a..105bc13bc9b 100644 --- a/forge-gui/res/cardsfolder/g/goatnap.txt +++ b/forge-gui/res/cardsfolder/g/goatnap.txt @@ -1,7 +1,7 @@ Name:Goatnap ManaCost:2 R Types:Sorcery -A:SP$ GainControl | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Untap$ True | AddKWs$ Haste | LoseControl$ EOT | SubAbility$ DBPump | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. If that creature is a, it also gets +3/+0 until end of turn. +A:SP$ GainControl | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Untap$ True | AddKWs$ Haste | LoseControl$ EOT | SubAbility$ DBPump | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. If that creature is a goat, it also gets +3/+0 until end of turn. SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ 3 | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X SVar:X:Targeted$Valid Goat Oracle:Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. If that creature is a goat, it also gets +3/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/r/rakshasa_vizier.txt b/forge-gui/res/cardsfolder/r/rakshasa_vizier.txt index d8d1c246e2b..41f5d8d8c85 100644 --- a/forge-gui/res/cardsfolder/r/rakshasa_vizier.txt +++ b/forge-gui/res/cardsfolder/r/rakshasa_vizier.txt @@ -2,7 +2,7 @@ Name:Rakshasa Vizier ManaCost:2 B G U Types:Creature Cat Demon PT:4/4 -T:Mode$ ChangesZoneAll | ValidCards$ Card.YouOwn | Origin$ Graveyard | Destination$ Exile | TriggerZones$ Battlefield | Execute$ TrigPutcounter | TriggerDescription$ Whenever one or more cards are put into exile from your graveyard, put that many +1/+1 counters on Rakshasa Vizier. +T:Mode$ ChangesZoneAll | ValidCards$ Card.YouOwn | Origin$ Graveyard | Destination$ Exile | TriggerZones$ Battlefield | Execute$ TrigPutcounter | TriggerDescription$ Whenever one or more cards are put into exile from your graveyard, put that many +1/+1 counters on CARDNAME. SVar:TrigPutcounter:DB$ PutCounter | CounterType$ P1P1 | Defined$ Self | CounterNum$ X | References$ X SVar:X:TriggerCount$Amount SVar:Picture:http://www.wizards.com/global/images/magic/general/rakshasa_vizier.jpg diff --git a/forge-gui/res/cardsfolder/r/rowan_kenrith.txt b/forge-gui/res/cardsfolder/r/rowan_kenrith.txt index 9868e082f06..302a8e04b57 100644 --- a/forge-gui/res/cardsfolder/r/rowan_kenrith.txt +++ b/forge-gui/res/cardsfolder/r/rowan_kenrith.txt @@ -4,7 +4,7 @@ Types:Legendary Planeswalker Rowan Loyalty:4 Text:CARDNAME can be your commander. K:Partner:Will Kenrith:Will -A:AB$ Effect | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | Name$ Rowan Kenrith Taunt Effect | ValidTgts$ Player | TgtPrompt$ Select target player | StaticAbilities$ MustAttack | References$ MustAttack | RememberObjects$ Targeted | IsCurse$ True | Triggers$ RemoveEffect | SVars$ ExileEffect | Duration$ Permanent | SubAbility$ DBCleanup | SpellDescription$ Creatures target player controls attack this turn if able. +A:AB$ Effect | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | Name$ Rowan Kenrith Taunt Effect | ValidTgts$ Player | TgtPrompt$ Select target player | StaticAbilities$ MustAttack | References$ MustAttack | RememberObjects$ Targeted | IsCurse$ True | Triggers$ RemoveEffect | SVars$ ExileEffect | Duration$ Permanent | SubAbility$ DBCleanup | SpellDescription$ During target player's next turn, each creature that player controls attacks if able. SVar:MustAttack:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.RememberedPlayerCtrl | AddHiddenKeyword$ CARDNAME attacks each combat if able. | Description$ Creatures target opponent controls attack this turn if able. SVar:RemoveEffect:Mode$ Phase | Phase$ Cleanup | ValidPlayer$ Player.IsRemembered | TriggerZones$ Command | Static$ True | Execute$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile From 34363829f0751b1a1dbaabfdb1ce52567491407b Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 14 Jun 2019 12:17:42 +0000 Subject: [PATCH 19/39] Update Kamahl's Druidic Vow SpellDescription --- forge-gui/res/cardsfolder/k/kamahls_druidic_vow.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/k/kamahls_druidic_vow.txt b/forge-gui/res/cardsfolder/k/kamahls_druidic_vow.txt index 4b197e4db3e..d1cb55fba67 100644 --- a/forge-gui/res/cardsfolder/k/kamahls_druidic_vow.txt +++ b/forge-gui/res/cardsfolder/k/kamahls_druidic_vow.txt @@ -1,7 +1,7 @@ Name:Kamahl's Druidic Vow ManaCost:X G G Types:Legendary Sorcery -A:SP$ Dig | Cost$ X G G | DigNum$ X | Reveal$ True | AnyNumber$ True | ChangeValid$ Land,Permanent.Legendary+cmcLEX | DestinationZone$ Battlefield | DestinationZone2$ Graveyard | References$ X | SpellDescription$ Reveal the top X cards of your library. You may put any number of permanent cards with converted mana cost X or less from among them onto the battlefield. Then put all cards revealed this way that weren't put onto the battlefield into your graveyard. +A:SP$ Dig | Cost$ X G G | DigNum$ X | Reveal$ True | AnyNumber$ True | ChangeValid$ Land,Permanent.Legendary+cmcLEX | DestinationZone$ Battlefield | DestinationZone2$ Graveyard | References$ X | SpellDescription$ Reveal the top X cards of your library. You may put any number of land and/or legendary permanent cards with converted mana cost X or less from among them onto the battlefield. Put the rest into your graveyard. SVar:X:Count$xPaid SVar:NeedsToPlayVar:Z GE6 SVar:Z:Count$Valid Land.YouCtrl+untapped From bf38dac8c8dcd4188410fd6d5cab51afc8fb03c6 Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Fri, 14 Jun 2019 15:28:53 +0000 Subject: [PATCH 20/39] Added a test for Necrotic Ooze copying Basking Rootwalla's ability from a graveyard. --- .../java/forge/ai/simulation/GameCopier.java | 19 ++++----------- .../ai/simulation/GameSimulatorTest.java | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java index 0664b2c767d..b2b8fa39ffa 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java @@ -1,24 +1,13 @@ package forge.ai.simulation; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import forge.LobbyPlayer; import forge.ai.LobbyPlayerAi; import forge.card.CardStateName; -import forge.game.Game; -import forge.game.GameEntity; -import forge.game.GameObject; -import forge.game.GameObjectMap; -import forge.game.GameRules; -import forge.game.Match; -import forge.game.StaticEffect; +import forge.game.*; import forge.game.card.*; import forge.game.card.token.TokenInfo; import forge.game.combat.Combat; @@ -28,13 +17,16 @@ import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.player.RegisteredPlayer; import forge.game.spellability.SpellAbility; -import forge.game.spellability.SpellAbilityRestriction; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.staticability.StaticAbility; import forge.game.trigger.TriggerType; import forge.game.zone.PlayerZoneBattlefield; import forge.game.zone.ZoneType; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + public class GameCopier { private static final ZoneType[] ZONES = new ZoneType[] { ZoneType.Battlefield, @@ -323,7 +315,6 @@ public class GameCopier { } if (c.isPlaneswalker()) { for (SpellAbility sa : c.getAllSpellAbilities()) { - SpellAbilityRestriction restrict = sa.getRestrictions(); int active = sa.getActivationsThisTurn(); if (sa.isPwAbility() && active > 0) { SpellAbility newSa = findSAInCard(sa, newCard); diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java index b521cd68f12..b63a885b3e5 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java @@ -1889,6 +1889,30 @@ public class GameSimulatorTest extends SimulationTestCase { assertTrue(awakened.getType().hasSubtype("Goblin")); } + public void testNecroticOozeActivateOnce() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + for (int i=0; i<7; i++) { addCardToZone("Swamp", p, ZoneType.Battlefield); } + for (int i=0; i<7; i++) { addCardToZone("Forest", p, ZoneType.Battlefield); } + + addCardToZone("Basking Rootwalla", p, ZoneType.Graveyard); + Card ooze = addCardToZone("Necrotic Ooze", p, ZoneType.Hand); + + SpellAbility oozeSA = ooze.getFirstSpellAbility(); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(oozeSA); + + Card oozeOTB = findCardWithName(sim.getSimulatedGameState(), "Necrotic Ooze"); + + assertTrue(oozeOTB != null); + + SpellAbility copiedSA = findSAWithPrefix(oozeOTB, "{1}{G}:"); + assertTrue(copiedSA != null); + assertTrue(copiedSA.getRestrictions().getLimitToCheck().equals("1")); + } + @SuppressWarnings("unused") public void broken_testCloneDimir() { Game game = initAndCreateGame(); From e1ed2da86cd2d634a0688f40c60e0227dc85bde9 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 14 Jun 2019 17:40:28 +0000 Subject: [PATCH 21/39] Update throatseeker --- forge-gui/res/cardsfolder/t/throatseeker.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/t/throatseeker.txt b/forge-gui/res/cardsfolder/t/throatseeker.txt index 4cf546ada03..5f94f090d87 100644 --- a/forge-gui/res/cardsfolder/t/throatseeker.txt +++ b/forge-gui/res/cardsfolder/t/throatseeker.txt @@ -2,6 +2,6 @@ Name:Throatseeker ManaCost:2 B Types:Creature Vampire Ninja PT:3/2 -S:Mode$ Continuous | Affected$ Ninja.attacking+unblocked | AddKeyword$ Lifelink | Description$ Unblocked attacking Ninjas you control have lifelink. +S:Mode$ Continuous | Affected$ Ninja.attacking+unblocked+YouCtrl | AddKeyword$ Lifelink | Description$ Unblocked attacking Ninjas you control have lifelink. SVar:PlayMain1:TRUE Oracle:Unblocked attacking Ninjas you control have lifelink. From ce90d3b8459c92a52aac21fdd7a03eb3edec08b2 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sat, 15 Jun 2019 01:02:02 +0000 Subject: [PATCH 22/39] Update Phantasmal Form --- forge-gui/res/cardsfolder/p/phantasmal_form.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/p/phantasmal_form.txt b/forge-gui/res/cardsfolder/p/phantasmal_form.txt index 0b3075c873c..4b554a788c0 100644 --- a/forge-gui/res/cardsfolder/p/phantasmal_form.txt +++ b/forge-gui/res/cardsfolder/p/phantasmal_form.txt @@ -1,7 +1,7 @@ Name:Phantasmal Form ManaCost:2 U Types:Instant -A:SP$ Animate | Cost$ 2 U | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select target creature | Power$ 3 | Toughness$ 3 | Keywords$ Flying | Colors$ Blue | Types$ Illusion | SpellDescription$ Until end of turn, up to two target creatures each have base power and toughness 3/3, gain flying, and become blue phase in addition to their other colors and types. +A:SP$ Animate | Cost$ 2 U | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select target creature | Power$ 3 | Toughness$ 3 | Keywords$ Flying | Colors$ Blue | Types$ Illusion | SubAbility$ DBDraw | SpellDescription$ Until end of turn, up to two target creatures each have base power and toughness 3/3, gain flying, and become blue phase in addition to their other colors and types. AI:RemoveDeck:All SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. Oracle:Until end of turn, up to two target creatures each have base power and toughness 3/3, gain flying, and become blue Illusions in addition to their other colors and types.\nDraw a card. From 60c967dcf753ad8ad5cb459a7b07784d77c802ee Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Jun 2019 07:38:19 +0300 Subject: [PATCH 23/39] - Fix AI for Sadistic Obsession. --- forge-gui/res/cardsfolder/s/sadistic_obsession.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/sadistic_obsession.txt b/forge-gui/res/cardsfolder/s/sadistic_obsession.txt index 333899f8501..0cbb51c2bea 100644 --- a/forge-gui/res/cardsfolder/s/sadistic_obsession.txt +++ b/forge-gui/res/cardsfolder/s/sadistic_obsession.txt @@ -4,7 +4,7 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 3 B | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ TapCounter | Description$ Enchanted creature has "{B}, {T}: Put a -1/-1 counter on target creature." -SVar:TapCounter:AB$ PutCounter | Cost$ B T | ValidTgts$ Creature | CounterType$ M1M1 | CounterNum$ 1 | SpellDescription$ Put a -1/-1 counter on target creature. +SVar:TapCounter:AB$ PutCounter | Cost$ B T | ValidTgts$ Creature | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True | SpellDescription$ Put a -1/-1 counter on target creature. SVar:NonStackingAttachEffect:True DeckHas:Ability$Counters Oracle:Enchant creature\nEnchanted creature has "{B}, {T}: Put a -1/-1 counter on target creature." From 379e8664246b3ea05233683bf44e9d4dfd559302 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Jun 2019 09:52:02 +0300 Subject: [PATCH 24/39] - Improve AI playability checks for Kicker costs --- .../main/java/forge/ai/ComputerUtilCard.java | 40 ++++++++++++++++--- .../java/forge/ai/PlayerControllerAi.java | 12 ++++++ .../res/cardsfolder/b/benalish_emissary.txt | 1 + forge-gui/res/cardsfolder/b/bog_down.txt | 3 ++ .../res/cardsfolder/c/caligo_skin_witch.txt | 2 + .../res/cardsfolder/d/dwarven_landslide.txt | 2 + .../res/cardsfolder/e/excavation_elephant.txt | 2 + .../cardsfolder/g/gatekeeper_of_malakir.txt | 2 +- .../res/cardsfolder/g/ghitu_chronicler.txt | 3 ++ .../res/cardsfolder/g/goblin_ruinblaster.txt | 1 + .../cardsfolder/h/heartstabber_mosquito.txt | 1 + .../res/cardsfolder/h/hypnotic_cloud.txt | 2 + forge-gui/res/cardsfolder/j/jilt.txt | 2 + .../res/cardsfolder/k/keldon_overseer.txt | 1 + forge-gui/res/cardsfolder/k/kor_aeronaut.txt | 1 + .../res/cardsfolder/k/kor_sanctifiers.txt | 3 ++ forge-gui/res/cardsfolder/m/magma_burst.txt | 3 ++ .../res/cardsfolder/m/marsh_casualties.txt | 1 + forge-gui/res/cardsfolder/m/mold_shambler.txt | 1 + .../res/cardsfolder/o/oran_rief_recluse.txt | 2 +- forge-gui/res/cardsfolder/o/orims_chant.txt | 1 + forge-gui/res/cardsfolder/o/orims_thunder.txt | 1 + forge-gui/res/cardsfolder/p/probe.txt | 2 + forge-gui/res/cardsfolder/r/rushing_river.txt | 2 + .../res/cardsfolder/s/shivan_emissary.txt | 2 +- forge-gui/res/cardsfolder/s/skizzik.txt | 4 ++ .../res/cardsfolder/s/strength_of_night.txt | 2 +- .../cardsfolder/t/territorial_allosaurus.txt | 1 + .../res/cardsfolder/t/tolarian_emissary.txt | 1 + .../res/cardsfolder/u/urborg_emissary.txt | 1 + .../res/cardsfolder/v/verduran_emissary.txt | 1 + 31 files changed, 93 insertions(+), 10 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 43aeb4c3c1b..e013f26d785 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1842,17 +1842,45 @@ public class ComputerUtilCard { String needsToPlayName = isRightSplit ? "SplitNeedsToPlay" : "NeedsToPlay"; String needsToPlayVarName = isRightSplit ? "SplitNeedsToPlayVar" : "NeedsToPlayVar"; - if (sa != null && sa.isEvoke()) { - if (card.hasSVar("NeedsToPlayEvoked")) { - needsToPlayName = "NeedsToPlayEvoked"; - } - if (card.hasSVar("NeedsToPlayEvokedVar")) { - needsToPlayVarName = "NeedsToPlayEvokedVar"; + // TODO: if there are ever split cards with Evoke or Kicker, factor in the right split option above + if (sa != null) { + if (sa.isEvoke()) { + // if the spell is evoked, will use NeedsToPlayEvoked if available (otherwise falls back to NeedsToPlay) + if (card.hasSVar("NeedsToPlayEvoked")) { + needsToPlayName = "NeedsToPlayEvoked"; + } + if (card.hasSVar("NeedsToPlayEvokedVar")) { + needsToPlayVarName = "NeedsToPlayEvokedVar"; + } + } else if (sa.isKicked()) { + // if the spell is kicked, uses NeedsToPlayKicked if able and locks out the regular NeedsToPlay check + // for unkicked spells, uses NeedsToPlay + if (card.hasSVar("NeedsToPlayKicked")) { + needsToPlayName = "NeedsToPlayKicked"; + } else { + needsToPlayName = "UNUSED"; + } + if (card.hasSVar("NeedsToPlayKickedVar")) { + needsToPlayVarName = "NeedsToPlayKickedVar"; + } else { + needsToPlayVarName = "UNUSED"; + } } } if (card.hasSVar(needsToPlayName)) { final String needsToPlay = card.getSVar(needsToPlayName); + + // A special case which checks that this creature will attack if it's the AI's turn + if (needsToPlay.equalsIgnoreCase("WillAttack")) { + if (game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) { + return ComputerUtilCard.doesSpecifiedCreatureAttackAI(sa.getActivatingPlayer(), card) ? + AiPlayDecision.WillPlay : AiPlayDecision.BadEtbEffects; + } else { + return AiPlayDecision.WillPlay; // not our turn, skip this check for the possible Flash use etc. + } + } + CardCollectionView list = game.getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, needsToPlay.split(","), card.getController(), card, null); diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 4f7b491d455..df01caaf238 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -1227,6 +1227,18 @@ public class PlayerControllerAi extends PlayerController { // Choose the optional cost if it can be paid (to be improved later, check for playability and other conditions perhaps) Cost fullCost = opt.getCost().copy().add(costSoFar); SpellAbility fullCostSa = chosen.copyWithDefinedCost(fullCost); + + // Playability check for Kicker + if (opt.getType() == OptionalCost.Kicker1 || opt.getType() == OptionalCost.Kicker2) { + SpellAbility kickedSaCopy = fullCostSa.copy(); + kickedSaCopy.addOptionalCost(opt.getType()); + Card copy = CardUtil.getLKICopy(chosen.getHostCard()); + copy.addOptionalCostPaid(opt.getType()); + if (ComputerUtilCard.checkNeedsToPlayReqs(copy, kickedSaCopy) != AiPlayDecision.WillPlay) { + continue; // don't choose kickers we don't want to play + } + } + if (ComputerUtilCost.canPayCost(fullCostSa, player)) { chosenOptCosts.add(opt); costSoFar.add(opt.getCost()); diff --git a/forge-gui/res/cardsfolder/b/benalish_emissary.txt b/forge-gui/res/cardsfolder/b/benalish_emissary.txt index 430c6072f3e..695fb18021c 100644 --- a/forge-gui/res/cardsfolder/b/benalish_emissary.txt +++ b/forge-gui/res/cardsfolder/b/benalish_emissary.txt @@ -6,5 +6,6 @@ K:Kicker:1 G T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target land. SVar:TrigKicker:DB$Destroy | ValidTgts$ Land | TgtPrompt$ Select target land DeckHints:Color$Green +SVar:NeedsToPlayKicked:Land.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/benalish_emissary.jpg Oracle:Kicker {1}{G} (You may pay an additional {1}{G} as you cast this spell.)\nWhen Benalish Emissary enters the battlefield, if it was kicked, destroy target land. diff --git a/forge-gui/res/cardsfolder/b/bog_down.txt b/forge-gui/res/cardsfolder/b/bog_down.txt index 381fcab0669..127d1745bba 100644 --- a/forge-gui/res/cardsfolder/b/bog_down.txt +++ b/forge-gui/res/cardsfolder/b/bog_down.txt @@ -4,5 +4,8 @@ Types:Sorcery K:Kicker:Sac<2/Land> A:SP$ Discard | Cost$ 2 B | ValidTgts$ Player | TgtPrompt$ Choose a player | NumCards$ WasKicked | References$ WasKicked | Mode$ TgtChoose | SpellDescription$ Target player discards two cards. If CARDNAME was kicked, that player discards three cards instead. SVar:WasKicked:Count$Kicked.3.2 +SVar:NeedsToPlayKickedVar:Z GE3 +SVar:Z:Count$ValidHand Card.OppCtrl +SVar:AIPreference:SacCost$Land.basic+YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_down.jpg Oracle:Kicker—Sacrifice two lands. (You may sacrifice two lands in addition to any other costs as you cast this spell.)\nTarget player discards two cards. If this spell was kicked, that player discards three cards instead. diff --git a/forge-gui/res/cardsfolder/c/caligo_skin_witch.txt b/forge-gui/res/cardsfolder/c/caligo_skin_witch.txt index db9cb3200b3..09282fc143a 100644 --- a/forge-gui/res/cardsfolder/c/caligo_skin_witch.txt +++ b/forge-gui/res/cardsfolder/c/caligo_skin_witch.txt @@ -5,4 +5,6 @@ PT:1/3 K:Kicker:3 B T:Mode$ ChangesZone | ValidCard$ Card.Self+kicked | Origin$ Any | Destination$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, each opponent discards two cards. SVar:TrigDiscard:DB$ Discard | Defined$ Player.Opponent | NumCards$ 2 | Mode$ TgtChoose +SVar:NeedsToPlayKickedVar:Z GE1 +SVar:Z:Count$ValidHand Card.OppCtrl Oracle:Kicker {3}{B} (You may pay an additional {3}{B} as you cast this spell.)\nWhen Caligo Skin-Witch enters the battlefield, if it was kicked, each opponent discards two cards. diff --git a/forge-gui/res/cardsfolder/d/dwarven_landslide.txt b/forge-gui/res/cardsfolder/d/dwarven_landslide.txt index ac41042fa2f..9b0a47d15de 100644 --- a/forge-gui/res/cardsfolder/d/dwarven_landslide.txt +++ b/forge-gui/res/cardsfolder/d/dwarven_landslide.txt @@ -4,5 +4,7 @@ Types:Sorcery K:Kicker:2 R Sac<1/Land> A:SP$ Destroy | Cost$ 3 R | ValidTgts$ Land | TargetMin$ X | TargetMax$ X | References$ X | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. If CARDNAME was kicked, destroy another target land. SVar:X:Count$Kicked.2.1 +SVar:NeedsToPlayKickedVar:Z GE2 +SVar:Z:Count$Valid Land.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_landslide.jpg Oracle:Kicker—{2}{R}, Sacrifice a land. (You may pay {2}{R} and sacrifice a land in addition to any other costs as you cast this spell.)\nDestroy target land. If Dwarven Landslide was kicked, destroy another target land. diff --git a/forge-gui/res/cardsfolder/e/excavation_elephant.txt b/forge-gui/res/cardsfolder/e/excavation_elephant.txt index 5d4c069b4d0..3d9fd4f727e 100644 --- a/forge-gui/res/cardsfolder/e/excavation_elephant.txt +++ b/forge-gui/res/cardsfolder/e/excavation_elephant.txt @@ -5,4 +5,6 @@ PT:3/5 K:Kicker:1 W T:Mode$ ChangesZone | ValidCard$ Card.Self+kicked | Origin$ Any | Destination$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, return target artifact card from your graveyard to your hand. SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouOwn +SVar:NeedsToPlayKickedVar:Z GE1 +SVar:Z:Count$ValidGraveyard Artifact.YouOwn Oracle:Kicker {1}{W} (You may pay an additional {1}{W} as you cast this spell.)\nWhen Excavation Elephant enters the battlefield, if it was kicked, return target artifact card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/g/gatekeeper_of_malakir.txt b/forge-gui/res/cardsfolder/g/gatekeeper_of_malakir.txt index 1e71c7024a4..9f428d0adec 100644 --- a/forge-gui/res/cardsfolder/g/gatekeeper_of_malakir.txt +++ b/forge-gui/res/cardsfolder/g/gatekeeper_of_malakir.txt @@ -5,7 +5,7 @@ PT:2/2 K:Kicker:B T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, target player sacrifices a creature. SVar:TrigKicker:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Creature | SacMessage$ Creature -SVar:NeedsToPlay:Creature.YouDontCtrl +SVar:NeedsToPlayKicked:Creature.YouDontCtrl SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/gatekeeper_of_malakir.jpg Oracle:Kicker {B} (You may pay an additional {B} as you cast this spell.)\nWhen Gatekeeper of Malakir enters the battlefield, if it was kicked, target player sacrifices a creature. diff --git a/forge-gui/res/cardsfolder/g/ghitu_chronicler.txt b/forge-gui/res/cardsfolder/g/ghitu_chronicler.txt index 59ec14dca72..93057963ce8 100644 --- a/forge-gui/res/cardsfolder/g/ghitu_chronicler.txt +++ b/forge-gui/res/cardsfolder/g/ghitu_chronicler.txt @@ -5,4 +5,7 @@ PT:1/3 K:Kicker:3 R T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, return target instant or sorcery card from your graveyard to your hand. SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl +SVar:NeedsToPlayKickedVar:Z GE1 +SVar:Z:Count$ValidGraveyard Instant.YouOwn/Plus.Z1 +SVar:Z1:Count$ValidGraveyard Sorcery.YouOwn Oracle:Kicker {3}{R} (You may pay an additional {3}{R} as you cast this spell.)\nWhen Ghitu Chronicler enters the battlefield, if it was kicked, return target instant or sorcery card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/g/goblin_ruinblaster.txt b/forge-gui/res/cardsfolder/g/goblin_ruinblaster.txt index 523769fd6f9..3ee041e0021 100644 --- a/forge-gui/res/cardsfolder/g/goblin_ruinblaster.txt +++ b/forge-gui/res/cardsfolder/g/goblin_ruinblaster.txt @@ -6,5 +6,6 @@ K:Haste K:Kicker:R T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target nonbasic land. SVar:TrigKicker:DB$Destroy | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land. +SVar:NeedsToPlayKicked:Land.nonBasic+OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_ruinblaster.jpg Oracle:Kicker {R} (You may pay an additional {R} as you cast this spell.)\nHaste\nWhen Goblin Ruinblaster enters the battlefield, if it was kicked, destroy target nonbasic land. diff --git a/forge-gui/res/cardsfolder/h/heartstabber_mosquito.txt b/forge-gui/res/cardsfolder/h/heartstabber_mosquito.txt index d2b45a5a3e2..e8ac0ea55c3 100644 --- a/forge-gui/res/cardsfolder/h/heartstabber_mosquito.txt +++ b/forge-gui/res/cardsfolder/h/heartstabber_mosquito.txt @@ -7,5 +7,6 @@ K:Kicker:2 B T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target creature. SVar:TrigKicker:DB$Destroy | ValidTgts$ Creature | TgtPrompt$ Select target creature. SVar:PlayMain1:TRUE +SVar:NeedsToPlayKicked:Creature.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/Heartstabber_Mosquito.jpg Oracle:Kicker {2}{B} (You may pay an additional {2}{B} as you cast this spell.)\nFlying\nWhen Heartstabber Mosquito enters the battlefield, if it was kicked, destroy target creature. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/h/hypnotic_cloud.txt b/forge-gui/res/cardsfolder/h/hypnotic_cloud.txt index af49ff69459..b7c816f91d3 100644 --- a/forge-gui/res/cardsfolder/h/hypnotic_cloud.txt +++ b/forge-gui/res/cardsfolder/h/hypnotic_cloud.txt @@ -4,5 +4,7 @@ Types:Sorcery K:Kicker:4 A:SP$ Discard | Cost$ 1 B | NumCards$ X | References$ X | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ TgtChoose | SpellDescription$ Target player discards a card. If CARDNAME was kicked, that player discards three cards instead. SVar:X:Count$Kicked.3.1 +SVar:NeedsToPlayKickedVar:Z GE2 +SVar:Z:Count$ValidHand Card.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/hypnotic_cloud.jpg Oracle:Kicker {4} (You may pay an additional {4} as you cast this spell.)\nTarget player discards a card. If Hypnotic Cloud was kicked, that player discards three cards instead. diff --git a/forge-gui/res/cardsfolder/j/jilt.txt b/forge-gui/res/cardsfolder/j/jilt.txt index 07c885f993e..1f372cb360c 100644 --- a/forge-gui/res/cardsfolder/j/jilt.txt +++ b/forge-gui/res/cardsfolder/j/jilt.txt @@ -5,5 +5,7 @@ K:Kicker:1 R A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature to bounce | TargetUnique$ True | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBDamage | SpellDescription$ Return target creature to its owner's hand. SVar:DBDamage:DB$ DealDamage | Condition$ Kicked | ValidTgts$ Creature | TgtPrompt$ Select another target creature to deal 2 damage | TargetUnique$ True | NumDmg$ 2 | TargetMin$ X | TargetMax$ X | SpellDescription$ If CARDNAME was kicked, it deals 2 damage to another target creature. SVar:X:Count$Kicked.1.0 +SVar:NeedsToPlayKickedVar:Z GE2 +SVar:Z:Count$Valid Creature.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/jilt.jpg Oracle:Kicker {1}{R} (You may pay an additional {1}{R} as you cast this spell.)\nReturn target creature to its owner's hand. If Jilt was kicked, it deals 2 damage to another target creature. diff --git a/forge-gui/res/cardsfolder/k/keldon_overseer.txt b/forge-gui/res/cardsfolder/k/keldon_overseer.txt index b72b86373cf..3be69da62f3 100644 --- a/forge-gui/res/cardsfolder/k/keldon_overseer.txt +++ b/forge-gui/res/cardsfolder/k/keldon_overseer.txt @@ -6,4 +6,5 @@ K:Kicker:3 R K:Haste T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. SVar:TrigKicker:DB$ GainControl | TgtPrompt$ Choose target creature. | ValidTgts$ Creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Gain control of target creature until end of turn, untap that creature, and it gains haste until end of turn. +SVar:NeedsToPlayKicked:Creature.OppCtrl Oracle:Kicker {3}{R} (You may pay an additional {3}{R} as you cast this spell.)\nHaste\nWhen Keldon Overseer enters the battlefield, if it was kicked, gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/k/kor_aeronaut.txt b/forge-gui/res/cardsfolder/k/kor_aeronaut.txt index 8effcc56db7..b104e1ccbde 100644 --- a/forge-gui/res/cardsfolder/k/kor_aeronaut.txt +++ b/forge-gui/res/cardsfolder/k/kor_aeronaut.txt @@ -7,5 +7,6 @@ K:Kicker:1 W T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, target creature gains flying until end of turn. SVar:TrigKicker:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying SVar:PlayMain1:True +SVar:NeedsToPlayKicked:Creature.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/Kor_Aeronaut.jpg Oracle:Kicker {1}{W} (You may pay an additional {1}{W} as you cast this spell.)\nFlying\nWhen Kor Aeronaut enters the battlefield, if it was kicked, target creature gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/k/kor_sanctifiers.txt b/forge-gui/res/cardsfolder/k/kor_sanctifiers.txt index f5de8cda75f..a4e03f07e28 100644 --- a/forge-gui/res/cardsfolder/k/kor_sanctifiers.txt +++ b/forge-gui/res/cardsfolder/k/kor_sanctifiers.txt @@ -5,5 +5,8 @@ PT:2/3 K:Kicker:W T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target artifact or enchantment. SVar:TrigKicker:DB$Destroy | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment. +SVar:NeedsToPlayKickedVar:Z GE1 +SVar:Z:Count$Valid Artifact.OppCtrl/Plus.Z1 +SVar:Z1:Count$Valid Enchantment.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/Kor_sanctifiers.jpg Oracle:Kicker {W} (You may pay an additional {W} as you cast this spell.)\nWhen Kor Sanctifiers enters the battlefield, if it was kicked, destroy target artifact or enchantment. diff --git a/forge-gui/res/cardsfolder/m/magma_burst.txt b/forge-gui/res/cardsfolder/m/magma_burst.txt index 2415c2b0884..698298d8595 100644 --- a/forge-gui/res/cardsfolder/m/magma_burst.txt +++ b/forge-gui/res/cardsfolder/m/magma_burst.txt @@ -4,6 +4,9 @@ Types:Instant K:Kicker:Sac<2/Land> A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | TargetMin$ X | TargetMax$ X | References$ X | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to any target. If CARDNAME was kicked, it deals 3 damage to another target. SVar:X:Count$Kicked.2.1 +SVar:NeedsToPlayKickedVar:Z GE2 +SVar:Z:Count$Valid Creature.OppCtrl/Plus.Z1 +SVar:Z1:Count$Valid Planeswalker.OppCtrl AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magma_burst.jpg Oracle:Kicker—Sacrifice two lands. (You may sacrifice two lands in addition to any other costs as you cast this spell.)\nMagma Burst deals 3 damage to any target. If Magma Burst was kicked, it deals 3 damage to another target. diff --git a/forge-gui/res/cardsfolder/m/marsh_casualties.txt b/forge-gui/res/cardsfolder/m/marsh_casualties.txt index 5c869b43ed9..611856fec81 100644 --- a/forge-gui/res/cardsfolder/m/marsh_casualties.txt +++ b/forge-gui/res/cardsfolder/m/marsh_casualties.txt @@ -4,5 +4,6 @@ Types:Sorcery K:Kicker:3 A:SP$ PumpAll | Cost$ B B | ValidTgts$ Player | TgtPrompt$ Select target player | ValidCards$ Creature | NumAtt$ -X | NumDef$ -X | References$ X | IsCurse$ True | SpellDescription$ Creatures target player controls get -1/-1 until end of turn. If CARDNAME was kicked, those creatures get -2/-2 until end of turn instead. SVar:X:Count$Kicked.2.1 +SVar:NeedsToPlayKicked:Creature.OppCtrl+toughnessEQ2 SVar:Picture:http://www.wizards.com/global/images/magic/general/marsh_casualties.jpg Oracle:Kicker {3} (You may pay an additional {3} as you cast this spell.)\nCreatures target player controls get -1/-1 until end of turn. If Marsh Casualties was kicked, those creatures get -2/-2 until end of turn instead. diff --git a/forge-gui/res/cardsfolder/m/mold_shambler.txt b/forge-gui/res/cardsfolder/m/mold_shambler.txt index 46bd5516fe4..20d5f704a90 100644 --- a/forge-gui/res/cardsfolder/m/mold_shambler.txt +++ b/forge-gui/res/cardsfolder/m/mold_shambler.txt @@ -5,5 +5,6 @@ PT:3/3 K:Kicker:1 G T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target noncreature permanent. SVar:TrigKicker:DB$Destroy | ValidTgts$ Permanent.nonCreature | TgtPrompt$ Select target noncreature permanent. +SVar:NeedsToPlay:Permanent.nonCreature+OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/mold_shambler.jpg Oracle:Kicker {1}{G} (You may pay an additional {1}{G} as you cast this spell.)\nWhen Mold Shambler enters the battlefield, if it was kicked, destroy target noncreature permanent. diff --git a/forge-gui/res/cardsfolder/o/oran_rief_recluse.txt b/forge-gui/res/cardsfolder/o/oran_rief_recluse.txt index 1ded78141f7..59c57282779 100644 --- a/forge-gui/res/cardsfolder/o/oran_rief_recluse.txt +++ b/forge-gui/res/cardsfolder/o/oran_rief_recluse.txt @@ -6,6 +6,6 @@ K:Kicker:2 G K:Reach T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target creature with flying. SVar:TrigDestroy:DB$Destroy | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying. -AI:RemoveDeck:All +SVar:NeedsToPlayKicked:Creature.withFlying+OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/oran_rief_recluse.jpg Oracle:Kicker {2}{G} (You may pay an additional {2}{G} as you cast this spell.)\nReach (This creature can block creatures with flying.)\nWhen Oran-Rief Recluse enters the battlefield, if it was kicked, destroy target creature with flying. diff --git a/forge-gui/res/cardsfolder/o/orims_chant.txt b/forge-gui/res/cardsfolder/o/orims_chant.txt index d8d666f6fa4..bf531791bbb 100644 --- a/forge-gui/res/cardsfolder/o/orims_chant.txt +++ b/forge-gui/res/cardsfolder/o/orims_chant.txt @@ -6,5 +6,6 @@ A:SP$ Effect | Cost$ W | Name$ Orim's Chant Effect | IsCurse$ True | StaticAbili SVar:CantAttackWhenKicked:DB$ Effect | Name$ Orim's Chant can't Attack Effect | IsCurse$ True | StaticAbilities$ CantAttack | Condition$ Kicked | SpellDescription$ If CARDNAME was kicked, creatures can't attack this turn. SVar:CantBeCast:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card | Caster$ Player.IsRemembered | Description$ Target player can't cast spells this turn. SVar:CantAttack:Mode$ Continuous | EffectZone$ Command | Affected$ Creature | AffectedZone$ Battlefield | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Creatures can't attack this turn. +SVar:NeedsToPlayKicked:Creature.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/orims_chant.jpg Oracle:Kicker {W} (You may pay an additional {W} as you cast this spell.)\nTarget player can't cast spells this turn.\nIf Orim's Chant was kicked, creatures can't attack this turn. diff --git a/forge-gui/res/cardsfolder/o/orims_thunder.txt b/forge-gui/res/cardsfolder/o/orims_thunder.txt index cb066851fa8..0cd9030d2b5 100644 --- a/forge-gui/res/cardsfolder/o/orims_thunder.txt +++ b/forge-gui/res/cardsfolder/o/orims_thunder.txt @@ -7,5 +7,6 @@ SVar:DBDamage:DB$DealDamage | Condition$ Kicked | ValidTgts$ Creature | TgtPromp SVar:X:Targeted$CardManaCost SVar:Y:Count$Kicked.1.0 DeckHints:Color$Red +SVar:NeedsToPlay:Creature.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/orims_thunder.jpg Oracle:Kicker {R} (You may pay an additional {R} as you cast this spell.)\nDestroy target artifact or enchantment. If Orim's Thunder was kicked, it deals damage equal to that permanent's converted mana cost to target creature. diff --git a/forge-gui/res/cardsfolder/p/probe.txt b/forge-gui/res/cardsfolder/p/probe.txt index e64bc38112e..6314eda7efd 100644 --- a/forge-gui/res/cardsfolder/p/probe.txt +++ b/forge-gui/res/cardsfolder/p/probe.txt @@ -6,5 +6,7 @@ A:SP$ Draw | Cost$ 2 U | NumCards$ 3 | SubAbility$ DBDiscardYou | SpellDescripti SVar:DBDiscardYou:DB$ Discard | Defined$ You | NumCards$ 2 | SubAbility$ DBDiscardTarget | Mode$ TgtChoose | SpellDescription$ then discard two cards. SVar:DBDiscardTarget:DB$ Discard | Condition$ Kicked | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ If CARDNAME was kicked, target player discards two cards. DeckHints:Color$Black +SVar:NeedsToPlayKickedVar:Z GE1 +SVar:Z:Count$ValidHand Card.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/probe.jpg Oracle:Kicker {1}{B} (You may pay an additional {1}{B} as you cast this spell.)\nDraw three cards, then discard two cards.\nIf Probe was kicked, target player discards two cards. diff --git a/forge-gui/res/cardsfolder/r/rushing_river.txt b/forge-gui/res/cardsfolder/r/rushing_river.txt index e73447c7bd3..4f83a95e0b2 100644 --- a/forge-gui/res/cardsfolder/r/rushing_river.txt +++ b/forge-gui/res/cardsfolder/r/rushing_river.txt @@ -4,5 +4,7 @@ Types:Instant K:Kicker:Sac<1/Land> A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | TargetMin$ X | TargetMax$ X | References$ X | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target nonland permanent to its owner's hand. If CARDNAME was kicked, return another target nonland permanent to its owner's hand. SVar:X:Count$Kicked.2.1 +SVar:NeedsToPlayKickedVar:Z GE2 +SVar:Z:Count$Valid Permanent.nonLand+OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/rushing_river.jpg Oracle:Kicker—Sacrifice a land. (You may sacrifice a land in addition to any other costs as you cast this spell.)\nReturn target nonland permanent to its owner's hand. If Rushing River was kicked, return another target nonland permanent to its owner's hand. diff --git a/forge-gui/res/cardsfolder/s/shivan_emissary.txt b/forge-gui/res/cardsfolder/s/shivan_emissary.txt index c92ccdf7d86..db81c97f1a2 100644 --- a/forge-gui/res/cardsfolder/s/shivan_emissary.txt +++ b/forge-gui/res/cardsfolder/s/shivan_emissary.txt @@ -5,7 +5,7 @@ PT:1/1 K:Kicker:1 B T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target nonblack creature. It can't be regenerated. SVar:TrigKicker:DB$Destroy | ValidTgts$ Creature.nonBlack | NoRegen$ True | TgtPrompt$ Select target nonblack creature -AI:RemoveDeck:Random DeckNeeds:Color$Black +SVar:NeedsToPlayKicked:Creature.nonBlack+OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/shivan_emissary.jpg Oracle:Kicker {1}{B} (You may pay an additional {1}{B} as you cast this spell.)\nWhen Shivan Emissary enters the battlefield, if it was kicked, destroy target nonblack creature. It can't be regenerated. diff --git a/forge-gui/res/cardsfolder/s/skizzik.txt b/forge-gui/res/cardsfolder/s/skizzik.txt index 2505c751475..ffaeaa7048e 100644 --- a/forge-gui/res/cardsfolder/s/skizzik.txt +++ b/forge-gui/res/cardsfolder/s/skizzik.txt @@ -7,5 +7,9 @@ K:Trample K:Kicker:R T:Mode$ Phase | Phase$ End of Turn | IsPresent$ Card.Self+notkicked | Execute$ TrigNotKicked | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of the end step, sacrifice CARDNAME unless it was kicked. SVar:TrigNotKicked:DB$Sacrifice | Defined$ Self +# The following construct specifies that the AI always plays the spell kicked, and plays it unkicked on its own turn only if it will attack +SVar:NeedsToPlay:WillAttack +SVar:NeedsToPlayKickedVar:Z GE1 +SVar:Z:Number$1 SVar:Picture:http://www.wizards.com/global/images/magic/general/skizzik.jpg Oracle:Kicker {R} (You may pay an additional {R} as you cast this spell.)\nTrample, haste\nAt the beginning of the end step, sacrifice Skizzik unless it was kicked. diff --git a/forge-gui/res/cardsfolder/s/strength_of_night.txt b/forge-gui/res/cardsfolder/s/strength_of_night.txt index 2b933f0fda3..96901d17bc2 100644 --- a/forge-gui/res/cardsfolder/s/strength_of_night.txt +++ b/forge-gui/res/cardsfolder/s/strength_of_night.txt @@ -4,7 +4,7 @@ Types:Instant K:Kicker:B A:SP$ PumpAll | Cost$ 2 G | ValidCards$ Creature.YouCtrl | NumAtt$ 1 | NumDef$ 1 | SubAbility$ DBPumpYourZombies | SpellDescription$ Creatures you control get +1/+1 until end of turn. If CARDNAME was kicked, Zombie creatures you control get an additional +2/+2 until end of turn. SVar:DBPumpYourZombies:DB$ PumpAll | ValidCards$ Creature.Zombie+YouCtrl | NumAtt$ 2 | NumDef$ 2 | Condition$ Kicked | ConditionDescription$ If Strength of Night was kicked, -AI:RemoveDeck:Random DeckNeeds:Color$Black & Type$Zombie +SVar:NeedsToPlayKicked:Creature.Zombie+YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/strength_of_night.jpg Oracle:Kicker {B} (You may pay an additional {B} as you cast this spell.)\nCreatures you control get +1/+1 until end of turn. If Strength of Night was kicked, Zombie creatures you control get an additional +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/t/territorial_allosaurus.txt b/forge-gui/res/cardsfolder/t/territorial_allosaurus.txt index 7107c646f8e..c4e6911b7e2 100644 --- a/forge-gui/res/cardsfolder/t/territorial_allosaurus.txt +++ b/forge-gui/res/cardsfolder/t/territorial_allosaurus.txt @@ -6,4 +6,5 @@ K:Kicker:2 G T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, it fights another target creature. SVar:TrigKicker:DB$ Fight | Defined$ TriggeredCardLKICopy | ValidTgts$ Creature.Other | TgtPrompt$ Choose another target creature SVar:PlayMain1:TRUE +SVar:NeedsToPlayKicked:Creature.OppCtrl+toughnessLE5 Oracle:Kicker {2}{G} (You may pay an additional {2}{G} as you cast this spell.)\nWhen Territorial Allosaurus enters the battlefield, if it was kicked, it fights another target creature. diff --git a/forge-gui/res/cardsfolder/t/tolarian_emissary.txt b/forge-gui/res/cardsfolder/t/tolarian_emissary.txt index c2c0e7fb6e0..fc2883ec0c2 100644 --- a/forge-gui/res/cardsfolder/t/tolarian_emissary.txt +++ b/forge-gui/res/cardsfolder/t/tolarian_emissary.txt @@ -7,5 +7,6 @@ K:Kicker:1 W T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target enchantment. SVar:TrigKicker:DB$Destroy | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment DeckHints:Color$White +SVar:NeedsToPlayKicked:Enchantment.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/tolarian_emissary.jpg Oracle:Kicker {1}{W} (You may pay an additional {1}{W} as you cast this spell.)\nFlying\nWhen Tolarian Emissary enters the battlefield, if it was kicked, destroy target enchantment. diff --git a/forge-gui/res/cardsfolder/u/urborg_emissary.txt b/forge-gui/res/cardsfolder/u/urborg_emissary.txt index a7ee4913ef4..519a5b00838 100644 --- a/forge-gui/res/cardsfolder/u/urborg_emissary.txt +++ b/forge-gui/res/cardsfolder/u/urborg_emissary.txt @@ -5,5 +5,6 @@ PT:3/1 K:Kicker:1 U T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, return target permanent to its owner's hand. SVar:TrigKicker:DB$ChangeZone | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand +SVar:NeedsToPlayKicked:Permanent.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_emissary.jpg Oracle:Kicker {1}{U} (You may pay an additional {1}{U} as you cast this spell.)\nWhen Urborg Emissary enters the battlefield, if it was kicked, return target permanent to its owner's hand. diff --git a/forge-gui/res/cardsfolder/v/verduran_emissary.txt b/forge-gui/res/cardsfolder/v/verduran_emissary.txt index 5a2a9a1447d..0f8a1b8df4c 100644 --- a/forge-gui/res/cardsfolder/v/verduran_emissary.txt +++ b/forge-gui/res/cardsfolder/v/verduran_emissary.txt @@ -6,5 +6,6 @@ K:Kicker:1 R T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target artifact. It can't be regenerated. SVar:TrigKicker:DB$Destroy | ValidTgts$ Artifact | NoRegen$ True | TgtPrompt$ Select target artifact DeckHints:Color$Red +SVar:NeedsToPlayKicked:Artifact.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/verduran_emissary.jpg Oracle:Kicker {1}{R} (You may pay an additional {1}{R} as you cast this spell.)\nWhen Verduran Emissary enters the battlefield, if it was kicked, destroy target artifact. It can't be regenerated. From 85ef08f4bb7b4f0ff67338fdebbf50ac79bd944e Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 15 Jun 2019 16:14:53 +0200 Subject: [PATCH 25/39] CardUtil: copy Kicker and OptionalCost into LKI --- forge-game/src/main/java/forge/game/card/CardUtil.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 542f11d9d8f..1308093997f 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -42,6 +42,7 @@ import forge.game.player.Player; import forge.game.replacement.ReplacementEffect; import forge.game.spellability.AbilityManaPart; import forge.game.spellability.AbilitySub; +import forge.game.spellability.OptionalCost; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.trigger.Trigger; @@ -308,6 +309,15 @@ public final class CardUtil { newCopy.updateKeywordsCache(newCopy.getState(s)); } + newCopy.setKickerMagnitude(in.getKickerMagnitude()); + + for (OptionalCost ocost : in.getOptionalCostsPaid()) { + newCopy.addOptionalCostPaid(ocost); + } + + newCopy.setCastSA(in.getCastSA()); + newCopy.setCastFrom(in.getCastFrom()); + return newCopy; } From 75a195f952aaae89530e3786761125f231d7e793 Mon Sep 17 00:00:00 2001 From: Computica Date: Sat, 15 Jun 2019 14:42:48 +0000 Subject: [PATCH 26/39] Battlebond - Stolen Strategy --- forge-gui/res/cardsfolder/s/stolen_strategy.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 forge-gui/res/cardsfolder/s/stolen_strategy.txt diff --git a/forge-gui/res/cardsfolder/s/stolen_strategy.txt b/forge-gui/res/cardsfolder/s/stolen_strategy.txt new file mode 100644 index 00000000000..bea88f35b7a --- /dev/null +++ b/forge-gui/res/cardsfolder/s/stolen_strategy.txt @@ -0,0 +1,12 @@ +Name:Stolen Strategy +ManaCost:4 R +Types:Enchantment +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ At the beginning of your upkeep, exile the top card of each opponent’s library. +SVar:TrigExile:DB$ Mill | Defined$ Player.Opponent | NumCards$ 1 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top card of each opponent's library. Until end of turn, you may cast nonland cards and you may spend mana as though it were mana of any color to cast those spells. +SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | Triggers$ TriggerCastDoM | SVars$ TrigRemoveSelf | RememberObjects$ Remembered | SubAbility$ DBCleanup +SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | Description$ Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it. +SVar:TriggerCastDoM:Mode$ SpellCast | ValidCard$ Card.IsRemembered | TriggerZones$ Command | Execute$ TrigRemoveSelf | Static$ True +SVar:TrigRemoveSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:Picture:https://img.scryfall.com/cards/large/en/bbd/64.jpg +Oracle:At the beginning of your upkeep, exile the top card of each opponent’s library. Until end of turn, you may cast nonland cards from among those exiled cards, and you may spend mana as though it were mana of any color to cast those spells. From 55a2cc92a43ce9ba7ba696f7e80a15d377fa36fb Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Jun 2019 18:02:16 +0300 Subject: [PATCH 27/39] - Revert a change in Epochrasite (no longer necessary) --- forge-gui/res/cardsfolder/e/epochrasite.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/e/epochrasite.txt b/forge-gui/res/cardsfolder/e/epochrasite.txt index f1e017ceebd..e6a5965d55a 100644 --- a/forge-gui/res/cardsfolder/e/epochrasite.txt +++ b/forge-gui/res/cardsfolder/e/epochrasite.txt @@ -2,7 +2,7 @@ Name:Epochrasite ManaCost:2 Types:Artifact Creature Construct PT:1/1 -K:etbCounter:P1P1:3:ValidLKI$ Card.Self+wasNotCastFromHand:CARDNAME enters the battlefield with three +1/+1 counters on it if you didn't cast it from your hand. +K:etbCounter:P1P1:3:ValidCard$ Card.Self+wasNotCastFromHand:CARDNAME enters the battlefield with three +1/+1 counters on it if you didn't cast it from your hand. T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigExile | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, exile it with three time counters on it and it gains suspend. SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile | SubAbility$ DBPutCounter | RememberChanged$ True SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ TIME | CounterNum$ 3 | SubAbility$ GiveSuspend From 946a96a9b097824e102e665f27c986c72ba17726 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Jun 2019 18:35:04 +0300 Subject: [PATCH 28/39] - Added a test for Epochrasite --- .../ai/simulation/GameSimulatorTest.java | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java index b63a885b3e5..062cdcb54ce 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java @@ -1849,7 +1849,7 @@ public class GameSimulatorTest extends SimulationTestCase { Card simSpark = (Card)sim.getGameCopier().find(sparkDouble); - assertTrue(simSpark != null); + assertNotNull(simSpark); assertTrue(simSpark.getZone().is(ZoneType.Battlefield)); assertTrue(simSpark.getCounters(CounterType.P1P1) == 1); assertTrue(simSpark.getCounters(CounterType.LOYALTY) == 5); @@ -1882,7 +1882,7 @@ public class GameSimulatorTest extends SimulationTestCase { Card awakened = findCardWithName(sim.getSimulatedGameState(), "Vitu-Ghazi"); - assertTrue(awakened != null); + assertNotNull(awakened); assertTrue(awakened.getName().equals("Vitu-Ghazi")); assertTrue(awakened.getCounters(CounterType.P1P1) == 9); assertTrue(awakened.hasKeyword(Keyword.HASTE)); @@ -1906,13 +1906,35 @@ public class GameSimulatorTest extends SimulationTestCase { Card oozeOTB = findCardWithName(sim.getSimulatedGameState(), "Necrotic Ooze"); - assertTrue(oozeOTB != null); + assertNotNull(oozeOTB); SpellAbility copiedSA = findSAWithPrefix(oozeOTB, "{1}{G}:"); - assertTrue(copiedSA != null); + assertNotNull(copiedSA); assertTrue(copiedSA.getRestrictions().getLimitToCheck().equals("1")); } + public void testEpochrasite() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + + for (int i=0; i<7; i++) { addCardToZone("Swamp", p, ZoneType.Battlefield); } + + Card epo = addCardToZone("Epochrasite", p, ZoneType.Graveyard); + Card animate = addCardToZone("Animate Dead", p, ZoneType.Hand); + + SpellAbility saAnimate = animate.getFirstSpellAbility(); + saAnimate.getTargets().add(epo); + + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(saAnimate); + + Card epoOTB = findCardWithName(sim.getSimulatedGameState(), "Epochrasite"); + + assertNotNull(epoOTB); + assertTrue(epoOTB.getCounters(CounterType.P1P1) == 3); + } + @SuppressWarnings("unused") public void broken_testCloneDimir() { Game game = initAndCreateGame(); From be9e53d517e554aaeb22cac44a5fd3fc9c53c91e Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Jun 2019 18:36:49 +0300 Subject: [PATCH 29/39] - Fix imports. --- .../main/java/forge/game/card/CardUtil.java | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 1308093997f..1c177ec82fa 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -17,18 +17,7 @@ */ package forge.game.card; -import java.util.List; -import java.util.Set; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.google.common.collect.Table; - -import io.sentry.Sentry; -import io.sentry.event.BreadcrumbBuilder; - +import com.google.common.collect.*; import forge.ImageKeys; import forge.card.CardStateName; import forge.card.CardType; @@ -40,15 +29,16 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.player.Player; import forge.game.replacement.ReplacementEffect; -import forge.game.spellability.AbilityManaPart; -import forge.game.spellability.AbilitySub; -import forge.game.spellability.OptionalCost; -import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; +import forge.game.spellability.*; import forge.game.trigger.Trigger; import forge.game.zone.ZoneType; import forge.util.TextUtil; import forge.util.collect.FCollection; +import io.sentry.Sentry; +import io.sentry.event.BreadcrumbBuilder; + +import java.util.List; +import java.util.Set; public final class CardUtil { // disable instantiation From df01fe50857ec8ff4d224db99d797b79fbba6536 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Jun 2019 21:02:42 +0300 Subject: [PATCH 30/39] - Fix AI logic for Teferi, Time Raveler --- forge-gui/res/cardsfolder/t/teferi_time_raveler.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/t/teferi_time_raveler.txt b/forge-gui/res/cardsfolder/t/teferi_time_raveler.txt index ecd0d2017e2..e8868aa1ba8 100644 --- a/forge-gui/res/cardsfolder/t/teferi_time_raveler.txt +++ b/forge-gui/res/cardsfolder/t/teferi_time_raveler.txt @@ -3,7 +3,7 @@ ManaCost:1 W U Types:Legendary Planeswalker Teferi Loyalty:4 S:Mode$ CantBeCast | ValidCard$ Card | Caster$ Opponent | OnlySorcerySpeed$ True | Description$ Each opponent can cast spells only any time they could cast a sorcery. -A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | StaticAbilities$ STPlay | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, you may cast sorcery spells as though they had flash. +A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | StaticAbilities$ STPlay | Duration$ UntilYourNextTurn | AILogic$ Main2 | SpellDescription$ Until your next turn, you may cast sorcery spells as though they had flash. SVar:STPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Sorcery | AffectedZone$ Exile,Graveyard,Hand,Library,Command | WithFlash$ You | Description$ Until your next turn, you may cast sorcery spells as though they had flash. 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 From ed818f1bd1652e6c7c798fa7dbb19cd976373021 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Jun 2019 22:12:06 +0300 Subject: [PATCH 31/39] - Fix the order of elements for Charm effect being random in the UI --- forge-gui/src/main/java/forge/player/PlayerControllerHuman.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index ae74cca90f4..4a7a109d68d 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1502,7 +1502,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont game.getTracker().unfreeze(); } final List possible = CharmEffect.makePossibleOptions(sa); - HashMap spellViewCache = new HashMap<>(); + LinkedHashMap spellViewCache = new LinkedHashMap<>(); for (AbilitySub spellAbility : possible) { spellViewCache.put(spellAbility.getView(), spellAbility); } From 7436bf5385617c0b79abd622dbc976ae00af5b01 Mon Sep 17 00:00:00 2001 From: schnautzr Date: Sat, 15 Jun 2019 15:44:48 -0500 Subject: [PATCH 32/39] format updates --- forge-gui/res/formats/Casual/pauper.txt | 1 + .../formats/Historic/DCI/Arena Standard/2019-02-14.txt | 7 +++++++ .../formats/Historic/DCI/Arena Standard/2019-05-24.txt | 7 +++++++ .../Historic/DCI/Arena Standard/China/2019-02-14.txt | 7 +++++++ .../Historic/DCI/Arena Standard/China/2019-05-24.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt | 2 +- forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt | 2 +- forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt | 2 +- forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Modern/2018-11-16.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Modern/2019-01-25.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Modern/2019-05-24.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Modern/2019-06-14.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Pauper/2019-05-24.txt | 7 +++++++ .../res/formats/Historic/DCI/Standard/2018-07-14.txt | 2 +- .../res/formats/Historic/DCI/Standard/2018-11-16.txt | 7 +++++++ .../res/formats/Historic/DCI/Standard/2019-01-25.txt | 7 +++++++ .../res/formats/Historic/DCI/Standard/2019-05-24.txt | 7 +++++++ .../formats/Historic/DCI/Standard/China/2018-06-22.txt | 7 +++++++ .../formats/Historic/DCI/Standard/China/2018-07-14.txt | 7 +++++++ .../formats/Historic/DCI/Standard/China/2018-10-06.txt | 7 +++++++ .../formats/Historic/DCI/Standard/China/2018-11-16.txt | 7 +++++++ .../formats/Historic/DCI/Standard/China/2019-01-25.txt | 7 +++++++ .../formats/Historic/DCI/Standard/China/2019-05-24.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt | 8 ++++++++ forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt | 2 +- forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt | 2 +- forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt | 8 ++++++++ forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt | 8 ++++++++ forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt | 8 ++++++++ forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt | 8 ++++++++ 35 files changed, 208 insertions(+), 6 deletions(-) create mode 100644 forge-gui/res/formats/Historic/DCI/Arena Standard/2019-02-14.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Arena Standard/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-02-14.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Modern/2018-11-16.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Modern/2019-01-25.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Modern/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Modern/2019-06-14.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Pauper/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/2018-11-16.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/2019-01-25.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/China/2018-06-22.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/China/2018-07-14.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/China/2018-10-06.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/China/2018-11-16.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/China/2019-01-25.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/China/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt diff --git a/forge-gui/res/formats/Casual/pauper.txt b/forge-gui/res/formats/Casual/pauper.txt index b1d4f6fbba7..9a7d7f51d72 100644 --- a/forge-gui/res/formats/Casual/pauper.txt +++ b/forge-gui/res/formats/Casual/pauper.txt @@ -4,3 +4,4 @@ Order:108 Subtype:Custom Type:Casual Rarities:L, C +Banned:Gush;Gitaxian Probe;Daze diff --git a/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-02-14.txt b/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-02-14.txt new file mode 100644 index 00000000000..3fc62fcfa46 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-02-14.txt @@ -0,0 +1,7 @@ +[format] +Name:Arena Standard, 2/14/19 +Type:Historic +Subtype:Standard +Effective:2019-02-14 +Sets:XLN, RIX, DOM, M19, GRN, G18, RNA +Banned:Nexus of Fate; Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-05-24.txt new file mode 100644 index 00000000000..4d3103a4f7a --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-05-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Arena Standard, War of the Spark +Type:Historic +Subtype:Standard +Effective:2019-05-24 +Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR +Banned:Nexus of Fate; Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-02-14.txt b/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-02-14.txt new file mode 100644 index 00000000000..ccd3417a3ef --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-02-14.txt @@ -0,0 +1,7 @@ +[format] +Name:China Arena Standard, 2/14/19 +Type:Historic +Subtype:Standard +Effective:2019-02-14 +Sets:XLN, RIX, DOM, GS1, M19, GRN, G18, RNA +Banned:Nexus of Fate; Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-05-24.txt new file mode 100644 index 00000000000..b4b4283b026 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-05-24.txt @@ -0,0 +1,7 @@ +[format] +Name:China Arena Standard, War of the Spark +Type:Historic +Subtype:Standard +Effective:2019-05-24 +Sets:XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR +Banned:Nexus of Fate; Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt new file mode 100644 index 00000000000..ee23213ddf6 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Jiang Yanggu & Mu Yanling +Type:Historic +Subtype:Legacy +Effective:2018-06-22 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt index 01766a2b756..701f7dd49ff 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt @@ -3,5 +3,5 @@ Name:Legacy, 07/06/18 Type:Historic Subtype:Legacy Effective:2018-07-06 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1 Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt index 7e2e6603f0d..772b6362eec 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt @@ -3,5 +3,5 @@ Name:Legacy, Core Set 2019 Type:Historic Subtype:Legacy Effective:2018-07-14 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19 Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt index 551753dca8a..7e9a7f13a54 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt @@ -3,5 +3,5 @@ Name:Legacy, Guilds of Ravnica Type:Historic Subtype:Legacy Effective:2018-10-06 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt new file mode 100644 index 00000000000..ede9f897a3b --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Gift Pack 2018 +Type:Historic +Subtype:Legacy +Effective:2018-16-16 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt new file mode 100644 index 00000000000..efacdd5ed6f --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Ravnica Allegiance +Type:Historic +Subtype:Legacy +Effective:2019-01-25 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt new file mode 100644 index 00000000000..cd5c2c9382c --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, War of the Spark +Type:Historic +Subtype:Legacy +Effective:2019-05-24 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt new file mode 100644 index 00000000000..870516080f9 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Modern Horizons +Type:Historic +Subtype:Legacy +Effective:2019-06-14 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR, MH1 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Modern/2018-11-16.txt new file mode 100644 index 00000000000..b90246831b6 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2018-11-16.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Gift Pack 2018 +Type:Historic +Subtype:Modern +Effective:2018-11-16 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18 +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Modern/2019-01-25.txt new file mode 100644 index 00000000000..ee5e7de45ca --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2019-01-25.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Ravnica Allegiance +Type:Historic +Subtype:Modern +Effective:2019-01-25 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Modern/2019-05-24.txt new file mode 100644 index 00000000000..c1a4bafe023 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2019-05-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, War of the Spark +Type:Historic +Subtype:Modern +Effective:2019-05-24 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2019-06-14.txt b/forge-gui/res/formats/Historic/DCI/Modern/2019-06-14.txt new file mode 100644 index 00000000000..d5722822ef8 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2019-06-14.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Modern Horizons +Type:Historic +Subtype:Modern +Effective:2019-06-14 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, MH1 +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Pauper/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Pauper/2019-05-24.txt new file mode 100644 index 00000000000..ed5449641c2 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pauper/2019-05-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Pauper, War of the Spark +Type:Historic +Subtype:Custom +Effective:2019-05-24 +Rarities:L, C +Banned:Gush;Gitaxian Probe;Daze diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Standard/2018-07-14.txt index 1fa39763228..88dedfb8d2d 100644 --- a/forge-gui/res/formats/Historic/DCI/Standard/2018-07-14.txt +++ b/forge-gui/res/formats/Historic/DCI/Standard/2018-07-14.txt @@ -2,6 +2,6 @@ Name:Standard, Core Set 2019 Type:Historic Subtype:Standard -Effective:2018-04-27 +Effective:2018-07-14 Sets:KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19 Banned:Aetherworks Marvel; Attune with Aether; Felidar Guardian; Rampaging Ferocidon; Ramunap Ruins; Rogue Refiner; Smuggler's Copter \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Standard/2018-11-16.txt new file mode 100644 index 00000000000..e52ee6b3beb --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2018-11-16.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, Gift Pack 2018 +Type:Historic +Subtype:Standard +Effective:2018-11-16 +Sets:XLN, RIX, DOM, M19, GRN, G18 +Banned:Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Standard/2019-01-25.txt new file mode 100644 index 00000000000..458763cc7e6 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2019-01-25.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, Ravnica Allegiance +Type:Historic +Subtype:Standard +Effective:2019-01-25 +Sets:XLN, RIX, DOM, M19, GRN, G18, RNA +Banned:Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Standard/2019-05-24.txt new file mode 100644 index 00000000000..f8cd2af1877 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2019-05-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, War of the Spark +Type:Historic +Subtype:Standard +Effective:2019-05-24 +Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR +Banned:Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2018-06-22.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-06-22.txt new file mode 100644 index 00000000000..cf8d7f245c0 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-06-22.txt @@ -0,0 +1,7 @@ +[format] +Name:China Standard, Jiang Yanggu & Mu Yanling +Type:Historic +Subtype:Standard +Effective:2018-06-22 +Sets:KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1 +Banned:Aetherworks Marvel; Attune with Aether; Felidar Guardian; Rampaging Ferocidon; Ramunap Ruins; Rogue Refiner; Smuggler's Copter \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-07-14.txt new file mode 100644 index 00000000000..4fc75027a0c --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-07-14.txt @@ -0,0 +1,7 @@ +[format] +Name:China Standard, Core Set 2019 +Type:Historic +Subtype:Standard +Effective:2018-07-14 +Sets:KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19 +Banned:Aetherworks Marvel; Attune with Aether; Felidar Guardian; Rampaging Ferocidon; Ramunap Ruins; Rogue Refiner; Smuggler's Copter \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2018-10-06.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-10-06.txt new file mode 100644 index 00000000000..9e289328925 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-10-06.txt @@ -0,0 +1,7 @@ +[format] +Name:China Standard, Guilds of Ravnica +Type:Historic +Subtype:Standard +Effective:2018-10-06 +Sets:XLN, RIX, DOM, GS1, M19, GRN +Banned:Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-11-16.txt new file mode 100644 index 00000000000..1a706b8ec8c --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-11-16.txt @@ -0,0 +1,7 @@ +[format] +Name:China Standard, Gift Pack 2018 +Type:Historic +Subtype:Standard +Effective:2018-11-16 +Sets:XLN, RIX, DOM, GS1, M19, GRN, G18 +Banned:Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2019-01-25.txt new file mode 100644 index 00000000000..c2b20a6f30b --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2019-01-25.txt @@ -0,0 +1,7 @@ +[format] +Name:China Standard, Ravnica Allegiance +Type:Historic +Subtype:Standard +Effective:2019-01-25 +Sets:XLN, RIX, DOM, GS1, M19, GRN, G18, RNA +Banned:Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2019-05-24.txt new file mode 100644 index 00000000000..e8fcaac588f --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2019-05-24.txt @@ -0,0 +1,7 @@ +[format] +Name:China Standard, War of the Spark +Type:Historic +Subtype:Standard +Effective:2019-05-24 +Sets:XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR +Banned:Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt new file mode 100644 index 00000000000..5e0a2aeeb16 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Jiang Yanggu & Mu Yanling +Type:Historic +Subtype:Vintage +Effective:2018-06-22 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1 +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt index 983de9d0a19..1e46ab461f3 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt @@ -3,6 +3,6 @@ Name:Vintage, Core Set 2019 Type:Historic Subtype:Vintage Effective:2018-07-06 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19 Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt index f4baed68ee0..335b48aab8f 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt @@ -3,6 +3,6 @@ Name:Vintage, Guilds of Ravnica Type:Historic Subtype:Vintage Effective:2018-10-06 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19 Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt new file mode 100644 index 00000000000..85472a7163e --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Gift Pack 2018 +Type:Historic +Subtype:Vintage +Effective:2018-11-16 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18 +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt new file mode 100644 index 00000000000..abb5d3902b8 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Ravnica Allegiance +Type:Historic +Subtype:Vintage +Effective:2019-01-25 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18, RNA +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt new file mode 100644 index 00000000000..cf7a3a2b78e --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, War of the Spark +Type:Historic +Subtype:Vintage +Effective:2019-05-24 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18, RNA, WAR +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt new file mode 100644 index 00000000000..1f10a6ea9e0 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Modern Horizons +Type:Historic +Subtype:Vintage +Effective:2019-06-14 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18, RNA, WAR, MH1 +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file From 147ad884daf5d5046df0b31487886170df83e035 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Sun, 16 Jun 2019 03:14:10 +0000 Subject: [PATCH 33/39] Ajani's Pride-may-te (functional) --- forge-gui/res/cardsfolder/a/ajanis_pridemate.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/ajanis_pridemate.txt b/forge-gui/res/cardsfolder/a/ajanis_pridemate.txt index 41409051805..9defa76ed61 100644 --- a/forge-gui/res/cardsfolder/a/ajanis_pridemate.txt +++ b/forge-gui/res/cardsfolder/a/ajanis_pridemate.txt @@ -2,9 +2,9 @@ Name:Ajani's Pridemate ManaCost:1 W Types:Creature Cat Soldier PT:2/2 -T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ Whenever you gain life, you may put a +1/+1 counter on CARDNAME. +T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you gain life, put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/ajanis_pridemate.jpg DeckHints:Ability$LifeGain DeckHas:Ability$Counters -Oracle:Whenever you gain life, you may put a +1/+1 counter on Ajani's Pridemate. +Oracle:Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate. From 27521623a6f293fc4c957f1279b8995aa3939047 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Sun, 16 Jun 2019 03:28:43 +0000 Subject: [PATCH 34/39] Missing a (nonfunctional) period. --- forge-gui/res/cardsfolder/t/transguild_courier.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/t/transguild_courier.txt b/forge-gui/res/cardsfolder/t/transguild_courier.txt index 43ff467cc3a..eb86b048b17 100644 --- a/forge-gui/res/cardsfolder/t/transguild_courier.txt +++ b/forge-gui/res/cardsfolder/t/transguild_courier.txt @@ -4,4 +4,4 @@ Types:Artifact Creature Golem S:Mode$ Continuous | EffectZone$ All | Affected$ Card.Self | CharacteristicDefining$ True | SetColor$ All | Description$ CARDNAME is all colors. PT:3/3 SVar:Picture:http://www.wizards.com/global/images/magic/general/transguild_courier.jpg -Oracle:Transguild Courier is all colors +Oracle:Transguild Courier is all colors. From 1eb609d30c75311001751ba329a140ea20027ebe Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Sun, 16 Jun 2019 03:31:39 +0000 Subject: [PATCH 35/39] Lord of Atlantis gets into commerce (functional... kinda) --- forge-gui/res/cardsfolder/l/lord_of_atlantis.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/l/lord_of_atlantis.txt b/forge-gui/res/cardsfolder/l/lord_of_atlantis.txt index 2b4be094498..4d45f152ab0 100644 --- a/forge-gui/res/cardsfolder/l/lord_of_atlantis.txt +++ b/forge-gui/res/cardsfolder/l/lord_of_atlantis.txt @@ -2,7 +2,7 @@ Name:Lord of Atlantis ManaCost:U U Types:Creature Merfolk PT:2/2 -S:Mode$ Continuous | Affected$ Creature.Merfolk+Other | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Islandwalk | Description$ Other Merfolk creatures get +1/+1 and have islandwalk. +S:Mode$ Continuous | Affected$ Card.Merfolk+Other | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Islandwalk | Description$ Other Merfolk get +1/+1 and have islandwalk. (They can't be blocked as long as defending player controls an Island.) SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/lord_of_atlantis.jpg -Oracle:Other Merfolk creatures get +1/+1 and have islandwalk. +Oracle:Other Merfolk get +1/+1 and have islandwalk. (They can't be blocked as long as defending player controls an Island.) From 3b4be89e553d0c848ac69dd162a85527f95ba0c3 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Sun, 16 Jun 2019 03:38:28 +0000 Subject: [PATCH 36/39] Planeswalker reminder text (nonfunctional) --- forge-gui/res/cardsfolder/n/narset_transcendent.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/n/narset_transcendent.txt b/forge-gui/res/cardsfolder/n/narset_transcendent.txt index 7500018e1ec..f00e39918ae 100644 --- a/forge-gui/res/cardsfolder/n/narset_transcendent.txt +++ b/forge-gui/res/cardsfolder/n/narset_transcendent.txt @@ -5,11 +5,11 @@ Loyalty:6 A:AB$ PeekAndReveal | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | AILogic$ Main2 | PeekAmount$ 1 | RevealValid$ Card.nonCreature+nonLand | RevealOptional$ True | RememberRevealed$ True | SubAbility$ DBChangeZone | SpellDescription$ Look at the top card of your library. If it's a noncreature, nonland card, you may reveal it and put it into your hand. SVar:DBChangeZone:DB$ ChangeZone | Defined$ TopOfLibrary | Origin$ Library | Destination$ Hand | ConditionDefined$ Remembered | ConditionPresent$ Card.nonCreature+nonLand | ConditionCompare$ EQ1 | SubAbility$ DBCleanupOne SVar:DBCleanupOne:DB$ Cleanup | ClearRemembered$ True -A:AB$Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | AILogic$ NarsetRebound | Stackable$ False | Name$ Narset Transcendent effect. | Triggers$ AddRebound | SVars$ AddReboundMain,DBCleanupTwo | SpellDescription$ When you cast your next instant or sorcery spell from your hand this turn, it gains rebound. +A:AB$Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | AILogic$ NarsetRebound | Stackable$ False | Name$ Narset Transcendent effect. | Triggers$ AddRebound | SVars$ AddReboundMain,DBCleanupTwo | SpellDescription$ When you cast your next instant or sorcery spell from your hand this turn, it gains rebound. (Exile the spell as it resolves. At the beginning of your next upkeep, you may cast that card from exile without paying its mana cost.) SVar:AddRebound:Mode$ SpellCast | ValidCard$ Instant.wasCastFromHand,Sorcery.wasCastFromHand | ValidActivatingPlayer$ You | OneOff$ True | Execute$ AddReboundMain | TriggerZones$ Command | TriggerDescription$ When you cast your next instant or sorcery spell from your hand this turn, it gains rebound. SVar:AddReboundMain:DB$ Pump | Defined$ TriggeredCard| KW$ Rebound | PumpZone$ Stack | SubAbility$ DBCleanupTwo SVar:DBCleanupTwo:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile A:AB$ Effect | Cost$ SubCounter<9/LOYALTY> | Name$ Emblem - Narset Transcendent | StaticAbilities$ STNarset | Planeswalker$ True | Ultimate$ True | Stackable$ False | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Your opponents can't cast noncreature spells." SVar:STNarset:Mode$ CantBeCast | ValidCard$ Card.nonCreature | Caster$ Opponent | EffectZone$ Command | Description$ Your opponents can't cast noncreature spells. SVar:Picture:http://www.wizards.com/global/images/magic/general/narset_transcendent.jpg -Oracle:[+1]: Look at the top card of your library. If it's a noncreature, nonland card, you may reveal it and put it into your hand.\n[-2]: When you cast your next instant or sorcery spell from your hand this turn, it gains rebound.\n[-9]: You get an emblem with "Your opponents can't cast noncreature spells." +Oracle:[+1]: Look at the top card of your library. If it's a noncreature, nonland card, you may reveal it and put it into your hand.\n[-2]: When you cast your next instant or sorcery spell from your hand this turn, it gains rebound. (Exile the spell as it resolves. At the beginning of your next upkeep, you may cast that card from exile without paying its mana cost.)\n[-9]: You get an emblem with "Your opponents can't cast noncreature spells." From 109339f05863b48d2a14c24fea7ef58f0b1818b3 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Sun, 16 Jun 2019 03:40:39 +0000 Subject: [PATCH 37/39] Creating Marit Lage (nonfunctional) --- forge-gui/res/cardsfolder/d/dark_depths.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/d/dark_depths.txt b/forge-gui/res/cardsfolder/d/dark_depths.txt index 923bb8f20d4..e4ec8c13d6a 100644 --- a/forge-gui/res/cardsfolder/d/dark_depths.txt +++ b/forge-gui/res/cardsfolder/d/dark_depths.txt @@ -3,9 +3,9 @@ ManaCost:no cost Types:Legendary Snow Land K:etbCounter:ICE:10 A:AB$ RemoveCounter | Cost$ 3 | CounterType$ ICE | CounterNum$ 1 | SpellDescription$ Remove an ice counter from CARDNAME. -T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_EQ0_ICE | Execute$ TrigSac | TriggerDescription$ When Dark Depths has no ice counters on it, sacrifice it. If you do, create a legendary 20/20 black Avatar creature token with flying and indestructible named Marit Lage. +T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_EQ0_ICE | Execute$ TrigSac | TriggerDescription$ When Dark Depths has no ice counters on it, sacrifice it. If you do, create Marit Lage, a legendary 20/20 black Avatar creature token with flying and indestructible. SVar:TrigSac:DB$ Sacrifice | RememberSacrificed$ True | SubAbility$ DBToken SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ marit_lage | TokenOwner$ You | LegacyImage$ marit lage v16 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_depths.jpg -Oracle:Dark Depths enters the battlefield with ten ice counters on it.\n{3}: Remove an ice counter from Dark Depths.\nWhen Dark Depths has no ice counters on it, sacrifice it. If you do, create a legendary 20/20 black Avatar creature token with flying and indestructible named Marit Lage. +Oracle:Dark Depths enters the battlefield with ten ice counters on it.\n{3}: Remove an ice counter from Dark Depths.\nWhen Dark Depths has no ice counters on it, sacrifice it. If you do, create Marit Lage, a legendary 20/20 black Avatar creature token with flying and indestructible. From 7273c36d7125eb820a2df68b1542558c9b32ad57 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Sun, 16 Jun 2019 03:42:59 +0000 Subject: [PATCH 38/39] Time Spiral zones (nonfunctional) --- forge-gui/res/cardsfolder/t/time_spiral.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/t/time_spiral.txt b/forge-gui/res/cardsfolder/t/time_spiral.txt index 2a5a967e054..954adfca9e0 100644 --- a/forge-gui/res/cardsfolder/t/time_spiral.txt +++ b/forge-gui/res/cardsfolder/t/time_spiral.txt @@ -1,9 +1,9 @@ Name:Time Spiral ManaCost:4 U U Types:Sorcery -A:SP$ ChangeZoneAll | Cost$ 4 U U | ChangeType$ Card | Origin$ Hand,Graveyard | Destination$ Library | Shuffle$ True | Random$ True | SubAbility$ DBDraw | UseAllOriginZones$ True | AILogic$ Timetwister | SpellDescription$ Each player shuffles their graveyard and hand into their library, then draws seven cards. Exile CARDNAME. You untap up to six lands. +A:SP$ ChangeZoneAll | Cost$ 4 U U | ChangeType$ Card | Origin$ Hand,Graveyard | Destination$ Library | Shuffle$ True | Random$ True | SubAbility$ DBDraw | UseAllOriginZones$ True | AILogic$ Timetwister | SpellDescription$ Each player shuffles their hand and graveyard into their library, then draws seven cards. Exile CARDNAME. You untap up to six lands. SVar:DBDraw:DB$ Draw | NumCards$ 7 | Defined$ Player | SubAbility$ DBChange | StackDescription$ None SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ DBUntap | StackDescription$ None SVar:DBUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land | Amount$ 6 | StackDescription$ None SVar:Picture:http://www.wizards.com/global/images/magic/general/time_spiral.jpg -Oracle:Exile Time Spiral. Each player shuffles their graveyard and hand into their library, then draws seven cards. You untap up to six lands. +Oracle:Exile Time Spiral. Each player shuffles their hand and graveyard into their library, then draws seven cards. You untap up to six lands. From 88ac34bad90a11aaec75359b99a5ad2f8a52875e Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Sun, 16 Jun 2019 03:45:39 +0000 Subject: [PATCH 39/39] Crazed Firecat and the tense verbs (nonfunctional) --- forge-gui/res/cardsfolder/c/crazed_firecat.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/crazed_firecat.txt b/forge-gui/res/cardsfolder/c/crazed_firecat.txt index 5729d197783..b7f1aa0f2bd 100644 --- a/forge-gui/res/cardsfolder/c/crazed_firecat.txt +++ b/forge-gui/res/cardsfolder/c/crazed_firecat.txt @@ -2,9 +2,9 @@ Name:Crazed Firecat ManaCost:5 R R Types:Creature Elemental Cat PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFlip | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin until you lose a flip. Put a +1/+1 counter on CARDNAME for each flip you win. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFlip | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin until you lose a flip. Put a +1/+1 counter on CARDNAME for each flip you won. SVar:TrigFlip:DB$ FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ X | LoseSubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | References$ X SVar:X:Number$0 SVar:Picture:http://www.wizards.com/global/images/magic/general/crazed_firecat.jpg -Oracle:When Crazed Firecat enters the battlefield, flip a coin until you lose a flip. Put a +1/+1 counter on Crazed Firecat for each flip you win. +Oracle:When Crazed Firecat enters the battlefield, flip a coin until you lose a flip. Put a +1/+1 counter on Crazed Firecat for each flip you won.